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

Posted

技术标签:

【中文标题】使用 JSOUP java 抓取数据时如何防止死超时?【英文标题】:How to prevent dead timed out while scraping data using JSOUP java? 【发布时间】:2021-01-23 14:45:13 【问题描述】:

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

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

有人可以帮忙吗?

PS 编辑:

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

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

    确保您的互联网连接稳定

感谢所有为这个问题提供建议的人

【问题讨论】:

嗯,你设置了一个timeout(6000),也就是6秒... (6,000 milliseconds),你试过设置得更高吗?我的意思是,如果您设置 timeout 并获得超时异常... :) 另外,一些网络服务器有各种安全代码,可以防止爬虫一次又一次地访问同一个站点。也许服务器是故意插入一个延迟...可能是? 很好的答案,将超时设置为更高的值,这真的很有帮助,谢谢:D 【参考方案1】:

您的互联网连接速度可能非常低。 检查您的互联网连接。

或者尝试浏览器上的网址。检查加载 html 需要多少时间。

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

【讨论】:

嗯很好的解决方案,我已经尝试改变我的连接并且它的工作,感谢您的建议:D【参考方案2】:

一些观察:

    堆栈跟踪显示客户端仍在进行 SSL 设置时发生超时。在此过程中可能会出现一些问题。

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

    你说它开始工作并停止工作。这可能是负载或拥塞问题。或者服务器可能已经看到重复调用来自您的客户端要求相同的 URL,并将其解释为 DOS 攻击或错误配置的应用程序......并在您的 IP 地址上设置一个块。

【讨论】:

以上是关于使用 JSOUP java 抓取数据时如何防止死超时?的主要内容,如果未能解决你的问题,请参考以下文章

使用Jsoup 抓取页面的数据

使用Jsoup 抓取页面的数据

Java 实现 HttpClients+jsoup,Jsoup,htmlunit,Headless Chrome 爬虫抓取数据

使用jsoup抓取和解析网页数据

java jsoup怎样爬取特定网页内的数据

求使用java语言抓取sina,搜狐网站上的新闻资讯的源码,或者原理说明也可~