我试图从50+动态网页中抓取实时数据,并需要每1-2秒更新一次数据。为此,我每隔1/2秒就安排一个计时器,该计时器遍历以下方法50次(针对50个URL):
public double fetchData(String link) {
String data = null;
try {
URL url = new URL();
urlConn = url.openConnection(link);
InputStreamReader inStream = new InputStreamReader(urlConn.getInputStream());
BufferedReader buff = new BufferedReader(inStream);
/*code that scrapes webpage, stores value in "data"*/
inStream.close();
buff.close();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
此方法可以工作,但每个URL大约需要一秒钟,或总计50秒。我还尝试过JSoup,希望可以使用以下代码克服延迟:
public double fetchData(String link, String identifier) {
Document doc;
String data = null;
try {
doc = Jsoup.connect(link).timeout(10*1000).get();
data = doc.getElementById(identifier).parent().child(0).text();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
但却遇到了大致相同的处理时间。是否有更快的方法同时从动态网页中提取数据,无论是通过URLConnection、JSoup还是其他方法?
发布于 2020-04-24 23:02:49
简单的回答是“使用线程”。为要重复刮取的每个50+ URL创建一个线程。
如果您使用URLConnection、JSoup或其他方式进行抓取,这很可能不会有什么不同。实际的瓶颈可能是由于:
bandwidth
第一个是你无法控制的(以积极的方式!)最后两个..。你也许能解决这个问题,但只能把钱花在这个问题上。例如,您可以支付一个更好的网络连接/路径,或支付替代主机移动您的刮刀接近您想要刮的网站。
切换到多线程抓取将改善其中的一些瓶颈,但不能消除它们。
但我不认为你做的是个好主意。
如果你写的东西每1或2秒重复重复擦拭相同的页面,他们会注意到的。他们会采取措施阻止你。很难处理的步骤。比如:
限制您的requests
如果这没有帮助的话,也许更严重的事情。
真正的解决方案可能是以更有效的方式获取信息;例如,通过API。这可能也要花你的钱。因为(当它归结为它)你的刮擦将花费他们的钱或者没有回报.或者,如果你的活动最终减少了人们对他们网站的点击量,你就会得到负面的回报。
https://stackoverflow.com/questions/61420974
复制