有哪些方法可以减少大型网站抓取所需的时间?

What approaches are available to reduce the time needed for a large site scrape?

我需要从网站上抓取大量数据。这个网站不属于我。该网站非常快。

要获取数据,我需要输入一些数据,触发 POST 请求,然后单击不同结果列表的所有 link。对于每个 link,我都需要解析单击它时出现的结果页面。现在我只是在使用 Selenium。

我估计我需要大约 13 个小时来解析我想要的所有内容。

性能并不是真的那么重要,但我担心 13 小时有点太长了,程序试图连续执行 13 小时可能会出现错误(某种冻结、中断或其他任何情况,所有这些都会增加整个事情的复杂性)。

有没有 Java 框架比 Selenium 更适合我想要实现的目标?我不确定是硒还是瓶颈的网站。我已经对应用程序进行了多线程处理。但我认为 Selenium 不应该用于我滥用它的目的,所以也许其他东西更快?

到目前为止,我只遇到过 JSoup,它似乎不太适合处理输入。我需要按照问题中的描述执行输入。我正在使用的网站使用 POST 请求来加载数据,所以我不能简单地通过 URL.

来加载它

回答我自己的问题:

我用 Jsoup 实现了相同的逻辑,时间基准产生了固定数据量的结果:

  • 硒:2 分 46 秒
  • Jsoup:16 秒

因此似乎Selenium 慢得多。我无法给出为什么会这样的技术原因。我只能猜测说是因为渲染开销。

您估计需要多少 HTTP 请求才能完全抓取您的目标网站?您想持续进行 13 小时的持续抓取 - 并且您希望它更快地完成 - 让我想知道您是否有可能对目标造成无意的拒绝服务攻击。

值得考虑的是,即使有问题的站点能够很好地处理您发送给他们的流量,您的爬虫频繁出现在他们的日志中可能会使您面临 IP 被封锁的风险,而且这种风险可能会增加如果您成功地加快了流程。

更好的策略是确保您拥有 最大 抓取速度:如果您在 HTTP 操作之间没有几秒钟的延迟,请将其添加。您可以减去您自己的开销时间,所以如果页面解析和渲染平均需要 0.5 秒,请延迟 1.5 秒,以满足您的目标延迟时间。

当然,如果没有关于您正在抓取的网站类型、您所在的位置、目标所在的位置以及您打算如何处理这些数据的任何信息,我们只是猜测合法性和道德性你的操作。通常基于版权问题,您可能不应该这样做。如果您正在做的事情有 API,请改用它。

请记住,目标站点随时可能阻止您的操作(或起诉您),因此您需要考虑如果发生这种情况,您的企业将如何以其他方式获取数据。