Я получаю исключение SocketTimeoutException в Jsoup: тайм-аут чтения - PullRequest
99 голосов
/ 04 июля 2011


Я получаю исключение 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)

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

EDIT: Хм ... Извините, только что нашел решение:

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

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

Ответы [ 6 ]

136 голосов
/ 04 июля 2011

Я думаю, вы можете сделать

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

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

24 голосов
/ 18 октября 2012

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

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

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

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

Тайм-аут, равный нулю, рассматривается как бесконечный тайм-аут.

2 голосов
/ 06 февраля 2018

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

1 голос
/ 11 января 2019

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

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();
0 голосов
/ 27 июня 2019

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

0 голосов
/ 19 декабря 2013

Установить время ожидания при подключении из jsoup.

...