Я отримую 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)

Дякую друзям!

EDIT: Гум ... Вибачте, щойно знайшли рішення:

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

Сподіваюся, що може бути корисним для когось іншого ... :)


3
Код, який ви додали у редагуванні, встановлює нескінченний час. Це небажано в більшості випадків використання. Набагато краще використовувати певний час очікування, як зазначено у відповіді MarcoS, навіть якщо час очікування тривалий.
степанець

2
Я думаю, що timeout(0)змусить Jsoup підключати URL знову і знову, поки він не підключиться.
Еван Ху

Відповіді:


138

Я думаю, ти можеш зробити

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

який встановлює час очікування на 10s.


3
121 пропозицій, але немає пояснень, чому це вирішує проблему? Чому це вирішує проблему, коли за замовчуванням, як видається, 30 секунд?
Алан Хей

2
@AlanHay моя відповідь пропонувала вирішити проблему, встановивши тайм-аут, а не використовуючи це конкретне значення як тайм-аут :)
MarcoS

26

Гаразд - так, я намагався запропонувати це як редагування відповіді MarcoS, але редакцію було відхилено. Тим не менш, наступна інформація може бути корисна майбутнім відвідувачам:

Згідно з javadocs , час очікування за замовчуванням протягом org.jsoup.Connection30 секунд.

Як вже було сказано, це можна встановити, використовуючи timeout(int millis)

Також, як зазначає ОП у редагуванні, це також можна встановити, використовуючи timeout(0). Однак, як заявляє javadocs:

Час очікування нуля трактується як нескінченний тайм-аут.


3
Встановлення нескінченного тайм-ауту - це погана ідея у більшості випадків. Використовуйте довгий час очікування, але завжди вказуйте його. Дивіться відповідь MarcoS.
степанець

3
@stepanian - щоб бути зрозумілим, я не виступаю за встановлення нескінченного тайм-ауту. Це було запропоновано ОР як рішення, хоча я хотів спрямувати майбутніх користувачів на наслідки цього. Дійсно, коли я спочатку розмістив свою "відповідь", я зазначив, що вважаю, що це має бути зміна відповіді MacroS, оскільки є додаткова інформація, яка може бути корисною майбутнім користувачам ... але редагування було відхилено.
здивування

Час очікування за замовчуванням - не 3 секунди, а 30 секунд (30000 мільйонів), ви можете побачити це у jsoup.org/apidocs/org/jsoup/Connection.html
aldok

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();


-6

Встановіть тайм-аут під час з'єднання з jsoup.


2
Будь ласка, додайте більш детальну інформацію про свою відповідь
Джо Тарас

Будь ласка, підтримайте свою відповідь поясненнями та фрагментами коду, якщо це необхідно.
Swapnil B.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.