我所做的是:
- 抓取页面
- 获取页面的所有链接,将它们放在列表中
- 启动一个新的爬虫,访问列表的每个链接
- 下载它们
必须有更快捷的方式,我可以在访问页面时直接下载链接? THX!
答案 0 :(得分:6)
crawler4j会自动为您完成此过程。您首先添加一个或多个种子页面。这些是首次获取和处理的页面。然后,crawler4j会提取这些页面中的所有链接,并将它们传递给您的shouldVisit函数。如果你真的想要抓取所有这些函数,那么这个函数应该只返回所有函数的true。如果您只想对特定域中的页面进行爬网,则可以检查URL并根据该值返回true或false。
您的shouldVisit返回true的那些URL然后由爬网程序线程提取,并对它们执行相同的过程。
示例代码here是一个很好的启动示例。
答案 1 :(得分:2)
一般方法是将爬网和下载任务分离为单独的工作线程,具有最大线程数,具体取决于您的内存要求(即您要用于存储所有这些信息的最大RAM)。 / p>
但是,crawler4j已经为您提供了此功能。通过将下载和爬网拆分为单独的线程,您可以尝试最大化连接的利用率,拉下连接可以处理的数据,并提供信息的服务器可以发送给您。对此的自然限制是,即使您生成1,000个线程,如果服务器仅以每秒0.3k的速度向您提供内容,那么您仍将仅下载300 KB /秒。但是你恐怕没有任何控制权,我担心。
提高速度的另一种方法是在具有更胖管道的系统上运行爬虫到互联网,因为我猜测,你的最大下载速度是当前数据获取速度的限制因素。例如,如果您在AWS实例(或任何云应用程序平台)上运行爬网,您将受益于它们与主干的极高速连接,并缩短了爬网集合所需的时间。有效地扩展您的带宽远远超出您在家庭或办公室连接中获得的带宽(除非您在ISP工作,即)。
理论上,在管道非常大的情况下,对于您保存到本地(或网络)磁盘存储的任何数据,限制开始成为磁盘的最大写入速度。