Jsoup SocketTimeoutException: Okuma zaman aşımına uğradı


101

Ben olsun SocketTimeoutExceptionben Jsoup kullanarak HTML belgeleri bir sürü ayrıştırmak çalıştığınızda.

Örneğin, bir bağlantı listem var:

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

Her bağlantı için, bu sayfalardaki diğer bilgileri almak için URL'ye bağlı belgeyi (href özniteliğinden) ayrıştırıyorum.

Bu yüzden çok zaman aldığını tahmin edebiliyorum, ancak bu istisnayı nasıl kapatabilirim İşte bütün yığın izleme:

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)

3
Düzenlemenize eklediğiniz kod, zaman aşımını sonsuza ayarlar. Çoğu kullanım durumunda bu istenmeyen bir durumdur. Zaman aşımı uzun olsa bile, MarcoS cevabında belirtildiği gibi belirli bir zaman aşımı kullanmak çok daha iyidir.
stepanian

2
Sanırım timeout(0)Jsoup, bağlanana kadar url'yi tekrar tekrar bağlayacak.
Evan Hu

Bu soru yazar tarafından bulunan çözüm gibi görünüyor C. Maillard Jsoup.connect(url).timeout(0).get(); göre daha erken revizyon
Scratte

Yanıtlar:


138

Yapabileceğini düşünüyorum

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

bu, zaman aşımını 10 saniyeye ayarlar.


3
121 olumlu oy veriyor ancak bunun neden sorunu çözdüğüne dair bir açıklama yok? Varsayılan 30 saniye görünürken, bu neden sorunu ele alıyor?
Alan Hay

2
@AlanHay cevabım, sorunu bir zaman aşımı olarak kullanarak değil, bir zaman aşımı ayarlayarak çözmeyi öneriyordu :)
MarcoS

26

Tamam - öyleyse, bunu MarcoS'un cevabına bir düzenleme olarak sunmaya çalıştım, ancak düzenleme reddedildi. Bununla birlikte, aşağıdaki bilgiler gelecekteki ziyaretçiler için yararlı olabilir:

Göre javadocs , varsayılan zaman aşımı bir için org.jsoup.Connection30 saniyedir.

Daha önce bahsedildiği gibi, bu, kullanılarak ayarlanabilir timeout(int millis)

Ayrıca, OP'nin düzenlemede not ettiği gibi, bu da kullanılarak ayarlanabilir timeout(0). Bununla birlikte, javadocs'un belirttiği gibi:

Sıfır zaman aşımı, sonsuz bir zaman aşımı olarak kabul edilir.


3
Sonsuz bir zaman aşımı ayarlamak çoğu durumda kötü bir fikirdir. Uzun bir zaman aşımı kullanın, ancak her zaman bir tane belirtin. MarcoS cevabına bakın.
stepanian

3
@stepanian - açık olmak gerekirse, sonsuz bir zaman aşımı ayarlamayı savunmuyorum. Bu, OP tarafından çözüm olarak önerilmişti, ancak gelecekteki kullanıcıları bunun sonuçlarına yönlendirmek istedim. Aslında, ilk olarak 'cevabımı' gönderdiğimde, MacroS'un cevabında bir düzenleme olması gerektiğini düşündüğümü belirtmiştim, çünkü gelecekteki kullanıcılar için yararlı olabilecek bazı ek bilgiler vardı ... ancak düzenleme reddedildi.
amaidment

Varsayılan zaman aşımı 3 saniye değil 30 saniyedir (30000 milisaniye), jsoup.org/apidocs/org/jsoup/Connection.html
aldok


3

Ben de aynı hatayı aldım:

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)

ve sadece ayar .userAgent(Opera)benim için çalıştı.

Bu yüzden Connection userAgent(String userAgent)Jsoup kullanıcı aracısını ayarlamak için Connection sınıfı yöntemini kullandım .

Gibi bir şey:

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


-6

Jsoup'tan bağlanırken zaman aşımını ayarlayın.


2
Lütfen cevabınız hakkında daha fazla bilgi ekleyin
Joe Taras

Lütfen cevabınızı gerekirse açıklamalar ve kod parçacıklarıyla destekleyin.
Swapnil B.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.