Я получаю SocketTimeoutException в Jsoup: время ожидания истекло

100


Я получаю SocketTimeoutException, когда пытаюсь проанализировать множество HTML-документов с помощью Jsoup.
Например, у меня есть список ссылок:

<a href="www.domain.com/url1.html">link1</a>
<a href="www.domain.com/url2.html">link2</a>
<a href="www.domain.com/url3.html">link3</a>
<a href="www.domain.com/url4.html">link4</a>

Для каждой ссылки я анализирую документ, связанный с URL-адресом (из атрибута href), чтобы получить другие части информации на этих страницах.
Я могу представить, что на это уходит много времени, но как отключить это исключение?
Вот вся трассировка стека:

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read1(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:381)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143)
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:132)
    at app.ForumCrawler.crawl(ForumCrawler.java:50)
    at Main.main(Main.java:15)

Спасибо, друзья!

РЕДАКТИРОВАТЬ: Хм ... Извините, только что нашел решение:

Jsoup.connect(url).timeout(0).get();

Надеюсь, это может быть полезно для кого-то еще ... :)

К. Майяр
источник
3
Код, который вы добавили при редактировании, устанавливает время ожидания на бесконечность. В большинстве случаев это нежелательно. Гораздо лучше использовать конкретный тайм-аут, как указано в ответе MarcoS, даже если тайм-аут длинный.
stepanian
2
Я предполагаю, что timeout(0)Jsoup снова и снова подключит URL-адрес, пока он не подключится.
Эван Ху

Ответы:

138

Я думаю ты справишься

Jsoup.connect("...").timeout(10 * 1000).get(); 

который устанавливает тайм-аут до 10 секунд.

MarcoS
источник
3
121 голос за, но нет объяснения, почему это решает проблему? Почему это решает проблему, если по умолчанию, как оказалось, 30 секунд?
Алан Хэй
2
@AlanHay мой ответ предлагал решить проблему, установив тайм-аут, а не используя это конкретное значение в качестве тайм-аута :)
MarcoS
26

Итак, я попытался предложить это как редактирование ответа MarcoS, но редактирование было отклонено. Тем не менее следующая информация может быть полезна будущим посетителям:

Согласно javadocs , тайм-аут по умолчанию org.jsoup.Connectionсоставляет 30 секунд.

Как уже упоминалось, это можно установить с помощью timeout(int millis)

Кроме того, как отмечает OP в редактировании, это также можно установить с помощью timeout(0). Однако, как утверждают javadocs:

Нулевое время ожидания рассматривается как бесконечное время ожидания.

вознаграждение
источник
3
Установка бесконечного тайм-аута в большинстве случаев - плохая идея. Используйте длительный тайм-аут, но всегда указывайте его. См. Ответ MarcoS.
Stepanian
3
@stepanian - чтобы было ясно, я не защищаю установку бесконечного тайм-аута. Это было предложено OP в качестве решения, хотя я хотел рассказать будущим пользователям о последствиях этого. Действительно, когда я изначально опубликовал свой «ответ», я указал, что, по моему мнению, это должно быть изменение ответа MacroS, поскольку была некоторая дополнительная информация, которая может быть полезна будущим пользователям ... но изменение было отклонено.
Amaidment 06
Тайм-аут по умолчанию составляет не 3 секунды, а 30 секунд (30000 миллисекунд), вы можете увидеть его в jsoup.org/apidocs/org/jsoup/Connection.html
aldok 04
3

Ошибка на https://jsoup.org/apidocs/org/jsoup/Connection.html . Тайм-аут по умолчанию не 30 секунд. Это 3 секунды. Просто посмотрите на javadoc в кодах. Там написано 3000 мс.

Бартек
источник
1
В java doc: «Тайм-аут по умолчанию составляет 30 секунд (30 000 миллисекунд). Нулевой тайм-аут рассматривается как бесконечный тайм-аут». jsoup.org/apidocs/org/jsoup/Connection.html
Jeton
3

У меня была такая же ошибка:

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)

и .userAgent(Opera)у меня работала только настройка .

Поэтому я использовал Connection userAgent(String userAgent)метод класса Connection для установки пользовательского агента Jsoup.

Что-то вроде:

Jsoup.connect("link").userAgent("Opera").get();
invzbl3
источник
-1

Это должно работать: Jsoup.connect(url.toLowerCase()).timeout(0);.

Прасанна Мендон
источник
-6

Установите тайм-аут при подключении из jsoup.

Гаураб Прадхан
источник
2
Пожалуйста, добавьте дополнительную информацию о своем ответе
Джо Тарас,
При необходимости подкрепите свой ответ пояснениями и фрагментами кода.
Swapnil B.