6

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

一定有更快的方法,我可以在访问页面时直接下载链接?谢谢!

4

2 回答 2

6

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

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

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

于 2012-01-10T19:35:29.723 回答
2

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

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

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

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

于 2012-01-10T14:34:48.043 回答