如何防止使用JSOUP Java抓取数据时出现死机超时?

问题描述

我学习了如何使用jsoup java从Web抓取数据,在第一次尝试中,我成功地获得了输出,但是当我再次尝试运行时,它给出了一条错误消息。这是我的代码

package solution;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class WebScrapper {

    public static void main(String[] args) throws IOException {

        Document d=Jsoup.connect("https://www.wikihow.com/wikiHowTo?search=adjust+bass+on+computerr").timeout(6000).get();
        Elements ele=d.select("div#searchresults_list");
        for (Element element : ele.select("div.result")) {
            String img_url=element.select("div.result_title").text();
            System.out.println(img_url);
        }

    }
}

这是我收到的消息错误

Exception in thread "main" 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)
    at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:466)
    at sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:460)
    at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:159)
    at sun.security.ssl.SSLTransport.decode(SSLTransport.java:110)
    at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1198)
    at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1107)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:400)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:372)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:587)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
    at org.jsoup.helper.httpconnection$Response.execute(httpconnection.java:732)
    at org.jsoup.helper.httpconnection$Response.execute(httpconnection.java:707)
    at org.jsoup.helper.httpconnection.execute(httpconnection.java:297)
    at org.jsoup.helper.httpconnection.get(httpconnection.java:286)
    at solution.WebScrapper.main(WebScrapper.java:14)

Process finished with exit code 1

任何人都可以帮忙吗?

解决方法

可能您的互联网连接速度很慢。 检查您的Internet连接。

或在浏览器上尝试该URL。检查加载html所需的时间。

此外,添加一个try-catch块。

,

一些观察结果:

  1. 堆栈跟踪显示超时发生在客户端仍在通过SSL设置时。在此过程中可能会出错。

  2. timeout(6000)将超时设置为6秒。这很短……如果网络路径拥塞,服务器距离很远,服务器负载很重,等等。

  3. 您说过,它从一开始就起作用,并且停止了工作。这可能是负载或拥塞问题。否则服务器可能已经看到来自您的客户端的重复呼叫要求相同的URL,并将其解释为DOS攻击或配置错误的应用程序……并在您的IP地址上加了一个阻止。