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.Connection
30 초입니다.
이미 언급했듯이 이것은 다음을 사용하여 설정할 수 있습니다. 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에서 연결하는 동안 시간 제한을 설정합니다.