[java] Jsoup에서 SocketTimeoutException이 발생합니다. 읽기 시간이 초과되었습니다.

Jsoup을 사용하여 많은 HTML 문서를 구문 분석하려고 할 때 SocketTimeoutException이 발생합니다.
예를 들어 링크 목록이 있습니다.

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

다른 사람에게 유용 할 수 있기를 바랍니다 … 🙂



답변

나는 당신이 할 수 있다고 생각합니다

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

시간 제한을 10 초로 설정합니다.


답변

좋아, MarcoS의 답변에 대한 편집으로 이것을 제공하려고했지만 편집이 거부되었습니다. 그럼에도 불구하고 다음 정보는 향후 방문자에게 유용 할 수 있습니다.

에 따르면 javadocs를 기본 타임 아웃 에 대한은 org.jsoup.Connection30 초입니다.

이미 언급했듯이 이것은 다음을 사용하여 설정할 수 있습니다. timeout(int millis)

또한 편집시 OP 메모로을 사용하여 설정할 수도 있습니다 timeout(0). 그러나 javadocs 상태는 다음과 같습니다.

0의 제한 시간은 무한 제한 시간으로 처리됩니다.


답변

https://jsoup.org/apidocs/org/jsoup/Connection.html에 오류가 있습니다 . 기본 시간 제한은 30 초가 아닙니다. 3 초입니다. 코드에서 javadoc을 살펴보십시오. 3000ms라고되어 있습니다.


답변

동일한 오류가 발생했습니다.

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에서 연결하는 동안 시간 제한을 설정합니다.


답변