如何防止在使用JSOUP java抓取数据时死机超时?

如何防止在使用JSOUP java抓取数据时死机超时?,java,html,web-scraping,proxy,jsoup,Java,Html,Web Scraping,Proxy,Jsoup,我学习了如何使用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; pub

我学习了如何使用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 WebScraper {

    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.WebScraper.main(WebScraper.java:14)

Process finished with exit code 1
有人能帮忙吗

附言编辑:

解决此问题后,有几种解决方法,例如:

  • 在超时参数中提供更高的值,例如设置为8000(6000之前)的时间

  • 确保您的internet连接稳定


  • 感谢所有对此问题提供建议的人

    可能您的internet连接速度很低。 检查你的互联网连接

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

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

    一些观察结果:

  • stacktrace显示超时发生在客户端仍在进行SSL设置时。在这个过程中,有一些事情可能会出错

  • 超时(6000)
    将超时设置为6秒。那很短。。。如果网络路径拥挤,服务器距离很远,服务器负载很重等等

  • 你说它一开始起作用,后来就停止了。这可能是负载或拥塞问题。或者,服务器可能看到您的客户端多次调用相同的URL,并将其解释为DOS攻击或配置错误的应用程序。。。并在您的IP地址上设置一个块


  • 嗯,很好的解决方案,我已经尝试更改我的连接,它正常工作了,谢谢你的建议:暂停,你已经设置了一个
    超时(6000)
    ,即6秒。。。(
    6000毫秒
    ),您是否尝试将其设置得更高?我的意思是,如果您设置了一个
    超时
    并得到一个超时异常…:)此外,一些web服务器具有各种各样的安全代码,以防止刮取器反复访问同一站点。可能服务器有意插入延迟。。。可能是吗?很好的答案设置一个更高的超时值,它真的很有用谢谢你:D