Java 建立50+;URL连接在1-2秒内同时进行

Java 建立50+;URL连接在1-2秒内同时进行,java,jsoup,urlconnection,Java,Jsoup,Urlconnection,我正试图从50多个动态网页中抓取实时数据,并需要每隔1-2秒更新一次数据。为此,我每隔1/2秒安排一个计时器,该计时器通过以下方法迭代50次(对于50个URL): 此方法可以工作,但每个URL大约需要一秒钟,或总共50秒。我还尝试了JSoup,希望可以使用以下代码克服延迟: public double fetchData(String link, String identifier) { Document doc; String data = null;

我正试图从50多个动态网页中抓取实时数据,并需要每隔1-2秒更新一次数据。为此,我每隔1/2秒安排一个计时器,该计时器通过以下方法迭代50次(对于50个URL):

此方法可以工作,但每个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还是其他方法?

简单的回答是“使用线程”。为要重复刮取的50多个URL中的每一个创建一个线程

如果使用URLConnection、JSoup或其他方式进行刮取,很可能不会有什么不同。实际的瓶颈可能是由于:

  • 要从中删除的服务器上的负载和负载性能
  • 网络带宽
  • 网络延迟
第一个问题超出了你的控制范围(以积极的方式!)。最后两个。。。你也许能解决这个问题,但只能通过花钱解决这个问题。例如,您可以为更好的网络连接/路径付费,或者为替代主机付费,以便将刮板移动到您试图刮板的站点附近

切换到多线程刮取将改善其中一些瓶颈,但不能消除它们


但我认为你现在做的不是一个好主意

如果你写的东西每1秒或2秒就重复刷新一次相同的页面,他们会注意到的。他们会采取措施阻止你。难以处理的步骤。例如:

  • 限制您的请求
  • 阻止您的IP或IP范围
  • 向您发送“停止”信函
如果这不起作用,可能会有更严重的事情发生

真正的解决办法可能是以更有效的方式获取信息;e、 g.通过API。这可能也会让你花钱。因为(当它归结为它)你的刮将花费他们的钱,要么没有回报。。。或者,如果你的活动最终减少了人们在他们网站上的点击量,那么你会得到负面回报。

简短的回答是“使用线程”。为要重复刮取的50多个URL中的每一个创建一个线程

如果使用URLConnection、JSoup或其他方式进行刮取,很可能不会有什么不同。实际的瓶颈可能是由于:

  • 要从中删除的服务器上的负载和负载性能
  • 网络带宽
  • 网络延迟
第一个问题超出了你的控制范围(以积极的方式!)。最后两个。。。你也许能解决这个问题,但只能通过花钱解决这个问题。例如,您可以为更好的网络连接/路径付费,或者为替代主机付费,以便将刮板移动到您试图刮板的站点附近

切换到多线程刮取将改善其中一些瓶颈,但不能消除它们


但我认为你现在做的不是一个好主意

如果你写的东西每1秒或2秒就重复刷新一次相同的页面,他们会注意到的。他们会采取措施阻止你。难以处理的步骤。例如:

  • 限制您的请求
  • 阻止您的IP或IP范围
  • 向您发送“停止”信函
如果这不起作用,可能会有更严重的事情发生


真正的解决办法可能是以更有效的方式获取信息;e、 g.通过API。这可能也会让你花钱。因为(当它归结为它)你的刮将花费他们的钱,要么没有回报。。。或者,如果你的活动最终减少了真实用户在其网站上的点击量,则会产生负回报。

我正在尝试每1-2秒从50多个动态网页中获取实时数据。不要那样做。那太疯狂了。我们都被关起来了,但我们可以一起度过难关。你为什么要这样做?恐怕我无法超越这一点,除非……你尝试过多线程吗?@Andreas-然后他必须解决下一个问题:网站主机限制速率或阻止其使用基础设施/违反使用条款。如果网站有一个API,它通常比下载HTML版本更快、更高效(在两端),现在HTML版本通常包含JS crud的公制bargeloads和你不想要的广告。OTOH是因为它更有价值——而且不充斥广告——一些网站会为此收费。我正试图每1-2秒从50多个动态网页中获取实时数据。不要那样做。那太疯狂了。我们都被关起来了,但我们可以一起度过难关。你为什么要这样做?恐怕我无法超越这一点,除非……你尝试过多线程吗?@Andreas-然后他必须解决下一个问题:网站主机限制速率或阻止其使用基础设施/违反使用条款。如果网站有一个API,它通常比下载HTML版本更快、更高效(在两端),现在HTML版本通常包含JS crud的公制bargeloads和你不想要的广告。OTOH是因为它更有价值——而且不全是广告——一些网站为此收费。
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;
}