Tôi nhận được một SocketTimeoutException trong Jsoup: Đã hết thời gian đọc


100


Tôi nhận được SocketTimeoutException khi cố gắng phân tích cú pháp nhiều tài liệu HTML bằng Jsoup.
Ví dụ, tôi có một danh sách các liên kết:

<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>

Đối với mỗi liên kết, tôi phân tích cú pháp tài liệu được liên kết với URL (từ thuộc tính href) để lấy các phần thông tin khác trong các trang đó.
Vì vậy, tôi có thể tưởng tượng rằng nó mất rất nhiều thời gian, nhưng làm thế nào để tắt ngoại lệ này?
Đây là toàn bộ dấu vết ngăn xếp:

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)

Cảm ơn các bạn!

EDIT: Hum ... Xin lỗi, chỉ tìm thấy giải pháp:

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

Hy vọng điều đó có thể hữu ích cho người khác ... :)


3
Mã bạn đã thêm trong bản chỉnh sửa của mình đặt thời gian chờ thành vô hạn. Đây là điều không mong muốn trong hầu hết các trường hợp sử dụng. Sẽ tốt hơn nhiều nếu sử dụng thời gian chờ cụ thể như được chỉ ra trong câu trả lời MarcoS, ngay cả khi thời gian chờ dài.
stepanian

2
Tôi đoán timeout(0)sẽ khiến Jsoup kết nối url nhiều lần cho đến khi nó kết nối.
Evan Hu

Câu trả lời:


138

Tôi nghĩ bạn có thể làm

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

đặt thời gian chờ thành 10 giây.


3
121 phiếu ủng hộ nhưng không có lời giải thích tại sao điều này khắc phục được sự cố? Tại sao điều đó giải quyết vấn đề khi mặc định là, nó sẽ xuất hiện, 30 giây?
Alan Hay

2
@AlanHay câu trả lời của tôi đã gợi ý để giải quyết vấn đề bằng cách thiết lập một thời gian chờ, không phải bằng cách sử dụng mà giá trị cụ thể như một thời gian chờ :)
Marcos

26

Được - vì vậy, tôi đã cố gắng đưa ra bản chỉnh sửa cho câu trả lời của MarcoS, nhưng bản chỉnh sửa đã bị từ chối. Tuy nhiên, thông tin sau có thể hữu ích cho những khách truy cập trong tương lai:

Theo javadocs , thời gian chờ mặc định cho một org.jsoup.Connectionlà 30 giây.

Như đã được đề cập, điều này có thể được thiết lập bằng cách sử dụng timeout(int millis)

Ngoài ra, như ghi chú OP trong bản chỉnh sửa, điều này cũng có thể được thiết lập bằng cách sử dụng timeout(0). Tuy nhiên, ở trạng thái javadocs:

Thời gian chờ bằng 0 được coi là thời gian chờ vô hạn.


3
Đặt thời gian chờ vô hạn là một ý tưởng tồi trong hầu hết các trường hợp. Sử dụng thời gian chờ dài, nhưng luôn chỉ định một thời gian chờ. Xem câu trả lời của MarcoS.
stepanian

3
@stepanian - nói rõ ràng, tôi không ủng hộ việc đặt thời gian chờ vô hạn. Điều này đã được OP đề xuất là giải pháp, mặc dù tôi muốn hướng người dùng trong tương lai đến những tác động của việc này. Thật vậy, khi ban đầu tôi đăng 'câu trả lời' của mình, tôi đã chỉ ra rằng tôi nghĩ rằng đó đáng lẽ phải là một bản chỉnh sửa cho câu trả lời của MacroS, vì có một số thông tin bổ sung có thể hữu ích cho người dùng trong tương lai ... nhưng bản chỉnh sửa đã bị từ chối.
amaidment

Thời gian chờ mặc định không phải là 3 giây mà là 30 giây (30000 mili), bạn có thể xem thời gian chờ đó trong jsoup.org/apidocs/org/jsoup/Connection.html
aldok Ngày


3

Tôi đã có những lỗi giống nhau:

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)

và chỉ cài đặt .userAgent(Opera)phù hợp với tôi.

Vì vậy, tôi đã sử dụng Connection userAgent(String userAgent)phương thức của lớp Connection để thiết lập tác nhân người dùng Jsoup.

Cái gì đó như:

Jsoup.connect("link").userAgent("Opera").get();


-6

Đặt thời gian chờ khi kết nối từ jsoup.


2
Vui lòng thêm thông tin mới hơn về câu trả lời của bạn
Joe Taras

Vui lòng hỗ trợ câu trả lời của bạn bằng các giải thích và đoạn mã nếu cần.
Swapnil B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.