如何在使用 JSOUP java 抓取数据时防止超时?
How to prevent dead timed out while scraping data using JSOUP java?
我学习了如何使用 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
有人可以帮忙吗?
P.S编辑:
解决这个问题后,有几种解决方法如:
给超时参数一个更大的值,例如时间设置为8000(6000之前)
确保您的互联网连接稳定
感谢所有对这个问题提出建议的人
可能是您的网速太慢了。
检查您的互联网连接。
或在浏览器上尝试url。检查加载 html.
需要多少时间
此外,添加一个 try-catch 块。
一些观察:
堆栈跟踪显示客户端仍在进行 SSL 设置时发生超时。在这个过程中有一些事情可能会出错。
timeout(6000)
将超时设置为 6 秒。那是很短的...如果网络路径拥塞,服务器距离远,服务器负载重等。
您说它开始时有效,但后来停止了。这可能是负载或拥塞问题。或者服务器可能已经看到来自您的客户端的 重复调用 请求相同的 URL,并将其解释为 DOS 攻击或错误配置的应用程序......并阻止你的IP地址。
我学习了如何使用 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
有人可以帮忙吗?
P.S编辑:
解决这个问题后,有几种解决方法如:
给超时参数一个更大的值,例如时间设置为8000(6000之前)
确保您的互联网连接稳定
感谢所有对这个问题提出建议的人
可能是您的网速太慢了。 检查您的互联网连接。
或在浏览器上尝试url。检查加载 html.
需要多少时间此外,添加一个 try-catch 块。
一些观察:
堆栈跟踪显示客户端仍在进行 SSL 设置时发生超时。在这个过程中有一些事情可能会出错。
timeout(6000)
将超时设置为 6 秒。那是很短的...如果网络路径拥塞,服务器距离远,服务器负载重等。您说它开始时有效,但后来停止了。这可能是负载或拥塞问题。或者服务器可能已经看到来自您的客户端的 重复调用 请求相同的 URL,并将其解释为 DOS 攻击或错误配置的应用程序......并阻止你的IP地址。