【问题标题】:How can I get crawler4j to download all links from a page more quickly?如何让 crawler4j 更快地从页面下载所有链接?
【发布时间】:2012-01-10 14:11:08
【问题描述】:

我所做的是:
- 抓取页面
- 获取页面的所有链接,将它们放在一个列表中
- 启动一个新的爬虫,它会访问列表中的每个链接
- 下载它们

一定有更快捷的方式,访问页面时可以直接下载链接吗?谢谢!

【问题讨论】:

    标签: java crawler4j


    【解决方案1】:

    crawler4j 会自动为您执行此过程。您首先添加一个或多个种子页面。这些是首先获取和处理的页面。 crawler4j 然后提取这些页面中的所有链接并将它们传递给您的 shouldVisit 函数。如果你真的想抓取所有这些,这个函数应该只在所有函数上返回 true。如果您只想抓取特定域内的页面,您可以检查 URL 并根据它返回 true 或 false。

    那些你的 shouldVisit 返回 true 的 URL,然后由爬虫线程获取,并在它们上执行相同的过程。

    示例代码here 是一个很好的入门示例。

    【讨论】:

      【解决方案2】:

      一般的方法是将抓取和下载任务分离到单独的工作线程中,线程的最大数量取决于您的内存要求(即您要用于存储所有这些信息的最大 RAM)。

      但是,crawler4j 已经为您提供了此功能。通过将下载和抓取分成单独的线程,您可以尝试最大限度地利用您的连接,尽可能多地拉取您的连接可以处理的数据,以及提供信息的服务器可以发送给您的数据。对此的自然限制是,即使您生成 1,000 个线程,如果服务器仅以每秒 0.3k 的速度为您提供内容,那么您每秒下载的内容仍然只有 300 KB。但恐怕你无法控制它的这方面。

      另一种提高速度的方法是在连接互联网的管道较粗的系统上运行爬虫,因为我猜你的最大下载速度是当前获取数据速度的限制因素。例如,如果您在 AWS 实例(或任何云应用程序平台)上运行抓取,您将受益于它们与主干网的极高速连接,并通过以下方式缩短抓取一组网站所需的时间有效地扩展您的带宽,远远超出您在家庭或办公室连接中获得的带宽(除非您在 ISP 工作,也就是说)。

      理论上,在您的管道非常大的情况下,对于您要保存到本地(或网络)磁盘存储的任何数据,限制开始成为磁盘的最大写入速度。

      p>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 2022-01-17
        • 2013-10-22
        • 1970-01-01
        相关资源
        最近更新 更多