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


100


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

다른 사람에게 유용 할 수 있기를 바랍니다 ... :)


3
편집에서 추가 한 코드는 제한 시간을 무한으로 설정합니다. 이는 대부분의 사용 사례에서 바람직하지 않습니다. 시간 초과가 길더라도 MarcoS 답변에 표시된 특정 시간 초과를 사용하는 것이 훨씬 좋습니다.
stepanian 2014

2
나는 timeout(0)그것이 연결될 때까지 Jsoup이 URL을 반복해서 연결하게 할 것이라고 생각합니다 .
Evan Hu

답변:


138

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

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

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


3
121 개의 찬성표가 있지만 문제가 해결되는 이유에 대한 설명이 없습니까? 기본값이 30 초로 나타날 때 문제가 해결되는 이유는 무엇입니까?
Alan Hay

2
@AlanHay 내 대답은 특정 값을 시간 제한으로 사용하지 않고 시간 제한을 설정하여 문제를 해결하도록 제안했습니다. :)
MarcoS

26

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

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

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

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

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


3
무한 시간 제한을 설정하는 것은 대부분의 경우 나쁜 생각입니다. 긴 시간 제한을 사용하되 항상 하나를 지정하십시오. MarcoS 답변을 참조하십시오.
stepanian 2014

3
@stepanian-명확하게 말하면 무한 시간 제한 설정을 옹호하지 않습니다. 이것은 미래의 사용자에게 이것의 의미를 알리고 싶었지만 OP의 해결책으로 제안되었습니다. 실제로 내가 처음에 내 '답변'을 게시했을 때 향후 사용자에게 유용 할 수있는 추가 정보가 있었기 때문에 MacroS의 답변을 편집해야한다고 생각했지만 편집이 거부되었습니다.

기본 시간 제한은 3 초가 아니라 30 초 (30000 밀리 초)입니다. jsoup.org/apidocs/org/jsoup/Connection.html
aldok


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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.