Saya mendapatkan SocketTimeoutException di Jsoup: Waktu baca habis


100


Saya mendapatkan SocketTimeoutException ketika saya mencoba mengurai banyak dokumen HTML menggunakan Jsoup.
Misalnya, saya mendapat daftar tautan:

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

Untuk setiap link, saya mengurai dokumen yang ditautkan ke URL (dari atribut href) untuk mendapatkan informasi lain di halaman tersebut.
Jadi saya dapat membayangkan bahwa itu membutuhkan banyak waktu, tetapi bagaimana cara mematikan pengecualian ini?
Berikut ini seluruh jejak tumpukan:

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)

Terima kasih sobat!

EDIT: Hum ... Maaf, baru saja menemukan solusinya:

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

Semoga bisa bermanfaat untuk orang lain ... :)


3
Kode yang Anda tambahkan dalam pengeditan Anda menyetel waktu tunggu menjadi tak terbatas. Ini tidak diinginkan dalam banyak kasus penggunaan. Jauh lebih baik menggunakan waktu tunggu tertentu seperti yang ditunjukkan dalam jawaban MarcoS, meskipun waktu tunggu itu lama.
stepanian

2
Saya kira itu timeout(0)akan membuat Jsoup menghubungkan url lagi dan lagi sampai terhubung.
Evan Hu

Jawaban:


138

Saya pikir Anda bisa melakukannya

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

yang menyetel waktu tunggu hingga 10 detik.


3
121 suara positif tetapi tidak ada penjelasan tentang mengapa ini memperbaiki masalah? Mengapa itu mengatasi masalah ketika defaultnya adalah, itu akan muncul, 30 detik?
Alan Hay

2
@AlanHay, jawaban saya menyarankan untuk memecahkan masalah dengan menyetel batas waktu, bukan dengan menggunakan nilai spesifik itu sebagai batas waktu :)
MarcoS

26

Oke - jadi, saya mencoba menawarkan ini sebagai pengeditan pada jawaban MarcoS, tetapi pengeditan itu ditolak. Meskipun demikian, informasi berikut mungkin berguna bagi pengunjung di masa mendatang:

Menurut javadocs , batas waktu default untuk an org.jsoup.Connectionadalah 30 detik.

Seperti yang telah disebutkan, ini dapat diatur menggunakan timeout(int millis)

Juga, sebagai catatan OP di edit, ini juga dapat diatur menggunakan timeout(0). Namun, sebagai javadocs menyatakan:

Waktu tunggu nol dianggap sebagai batas waktu tak terbatas.


3
Menyetel waktu tunggu tak terbatas adalah ide yang buruk dalam banyak kasus. Gunakan waktu tunggu yang lama, tetapi selalu tentukan satu. Lihat jawaban MarcoS.
stepanian

3
@stepanian - untuk memperjelas, saya tidak menganjurkan pengaturan batas waktu tak terbatas. Ini telah disarankan sebagai solusi oleh OP, meskipun saya ingin mengarahkan pengguna di masa mendatang pada implikasi dari ini. Memang, ketika saya awalnya memposting 'jawaban' saya, saya mengindikasikan bahwa saya pikir itu seharusnya merupakan edit pada jawaban MacroS, karena ada beberapa informasi tambahan yang mungkin berguna bagi pengguna di masa depan ... tetapi suntingan ditolak.
keheranan

Batas waktu default bukanlah 3 detik, tetapi 30 detik (30000 milis), Anda dapat melihatnya di jsoup.org/apidocs/org/jsoup/Connection.html
aldok


3

Saya mengalami kesalahan yang sama:

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)

dan hanya pengaturan yang .userAgent(Opera)berhasil untuk saya.

Jadi saya menggunakan Connection userAgent(String userAgent)metode kelas Connection untuk mengatur agen pengguna Jsoup.

Sesuatu seperti:

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


-6

Tetapkan waktu tunggu saat menghubungkan dari jsoup.


2
Silakan tambahkan info lebih lanjut tentang jawaban Anda
Joe Taras

Harap dukung jawaban Anda dengan penjelasan dan potongan kode jika perlu.
Swapnil B.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.