Получение исходного кода для следующей страницы с использованием Java

#java #url #gzip

#java #url #gzip

Вопрос:

Я пытаюсь получить исходный код для следующей страницы: http://www.amazon.com/gp/offer-listing/082470732X/ref=dp_olp_0?ie=UTF8amp;redirect=trueamp;condition=all (Пожалуйста, обратите внимание, что Amazon переводит вас на другую страницу, если вы нажмете на ссылку. Чтобы перейти на страницу, которую мне интересно прочитать, пожалуйста, скопируйте ссылку и вставьте ее на пустую вкладку в вашем браузере. Спасибо!)

Обычно с помощью java.net API, я могу получить исходный код для большинства URL-адресов практически без проблем, однако по приведенной выше ссылке я ничего не получаю. Оказалось, что входной поток, генерируемый соединением, кодируется gzip, поэтому я попробовал следующее:

 URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream is = urlConnection.getInputStream();
HttpURLConnection.setFollowRedirects(true);
urlConnection.setRequestProperty("Accept-Encoding", "gzip, deflate");
String encoding = urlConnection.getContentEncoding();
if (encoding != null amp;amp; encoding.equalsIgnoreCase("gzip")) {
     is = new GZIPInputStream(is);
} else if (encoding != null amp;amp; encoding.equalsIgnoreCase("deflate")) {
     is = new InflaterInputStream((is), new Inflater(true));
}
  

Однако на этот раз я получаю следующую ошибку детерминированно:

 java.io.EOFException
at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:249)
at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:239)
at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:142)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:58)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:67)
at domain.logic.ItemScraper.loadURL(ItemScraper.java:405)
at domain.logic.ItemScraper.main(ItemScraper.java:510)
  

Кто-нибудь может увидеть мою ошибку? Есть ли другой способ прочитать эту конкретную страницу? Может ли кто-нибудь объяснить мне, почему мой браузер (firefox) может его прочитать, однако я не могу прочитать исходный код с помощью Java?

Заранее спасибо, с наилучшими пожеланиями,

Комментарии:

1. я могу просмотреть его с помощью VIEW GENERATED SOURCE в Firefox с помощью плагина WebDeveloper. Честно говоря, кажется глупым делать это с Java

2. где is настраивается? .. тот, который передается в GZIPInputStream

3. Пожалуйста, опубликуйте, где вы создаете is .

4. Извините всех, это уже было похоже: is = URLConnection.getInputStream();

Ответ №1:

Вместо

 is = new GZIPInputStream(is);
  

попробуйте

 is = new GZIPInputStream(urlConnection.getInputStream());
  

Что касается EOFException , если вы добавите

 urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24");
  

это исчезло бы.

Комментарии:

1. Отличный ответ. Это сработало! Не могли бы вы объяснить, что это делает? Я имею в виду, что изменилось? Это обмануло Amazon, чтобы он был похож на настоящий веб-браузер или что-то в этомроде?

Ответ №2:

Вы можете использовать стандартный BufferedReader для чтения ответа веб-сервера на заданный URL.

 URLIn = new BufferedReader(new InputStreamReader(new URL(URLOrFilename).openStream()));
  

Затем используйте …

 while ((incomingLine = URLIn.readLine()) != null) {
 ...
}
  

… чтобы получить ответ.

Комментарии:

1. Ах, вы правы — это была опечатка (я исправил код). Я использовал приведенный выше код в веб-пауке, который я написал много лет назад в Java 1.4.2 — так что он должен работать в любой версии, более новой, чем эта.