Ответ 1
Я думаю, что вы можете сделать
Jsoup.connect("...").timeout(10 * 1000).get();
который устанавливает тайм-аут на 10 с.
Я получаю исключение 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: Hum... Извините, просто нашел решение:
Jsoup.connect(url).timeout(0).get();
Надеюсь, что это может быть полезно для кого-то еще...:)
Я думаю, что вы можете сделать
Jsoup.connect("...").timeout(10 * 1000).get();
который устанавливает тайм-аут на 10 с.
Итак, я попытался предложить это в качестве редактирования ответа MarcoS, но редактирование было отклонено. Тем не менее, следующая информация может быть полезна для будущих посетителей:
Согласно javadocs, время ожидания по умолчанию для org.jsoup.Connection
составляет 30 секунд.
Как уже упоминалось, это можно установить с помощью timeout(int millis)
Кроме того, как отмечает OP при редактировании, это также можно установить с помощью timeout(0)
. Тем не менее, как утверждают Javadocs:
Тайм-аут, равный нулю, рассматривается как бесконечный тайм-аут.
Ошибка на https://jsoup.org/apidocs/org/jsoup/Connection.html. Время ожидания по умолчанию не 30 секунд. Это 3 секунды. Просто посмотрите на Javadoc в кодах. Это говорит 3000 мс.
установите метод тайм-аута на следующее значение.
Jsoup.connect("http://www.examplpe.com").timeout(10*1000).get();
это установит таймаут на 10 секунд.
У меня была такая же ошибка:
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();
Это должно работать: Jsoup.connect(url.toLowerCase()).timeout(0);
,
Установите время ожидания при подключении к jsoup.