#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
настраивается? .. тот, который передается в GZIPInputStream3. Пожалуйста, опубликуйте, где вы создаете
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 — так что он должен работать в любой версии, более новой, чем эта.