如何近实时地增量抓取大型网站

时间:2016-10-01 09:56:49

标签: python postgresql web-scraping scrapy

我想刮掉很多(几百个)网站,这些网站基本上就像公告牌一样。其中一些非常大(高达150万)并且也在快速增长。我想要实现的是:

  • 抓取所有现有条目
  • 实时抓取所有新条目(理想情况下,间隔约1小时或更短)

为此,我们使用scrapy并将项目保存在postresql数据库中。现在的问题是,我怎样才能确保我每次都没有抓取整个网站而得到所有记录? (这不会在交通方面非常激进,但也不可能在1小时内完成。)

例如:我的网站有100页,每页10条记录。所以我抓第1页,然后转到第2页。但是在快速增长的网站上,当我执行第2页的请求时,可能会有10条新记录,所以我会再次获得相同的项目。不过我最终会收到所有物品。 但是下次抓这个网站,我怎么知道在哪里停下来?我无法停止在我的数据库中已有的第一条记录,因为这可能突然出现在第一页上,因为有新的回复。

我不确定我是否能得到我的观点,但是tl; dr:如何以增量方式获取快速增长的BBS?因此获取所有记录,但每次只获取新记录。我查看了scrapy的恢复功能以及scrapinghubs deltafetch中间件,但我不知道他们是否(以及如何)可以帮助克服这个问题。

1 个答案:

答案 0 :(得分:1)

  

例如:我的网站有100页,每页10条记录。所以我抓第1页,然后转到第2页。但是在快速增长的网站上,当我执行第2页的请求时,可能会有10条新记录,所以我会再次获得相同的项目。不过我最终会收到所有物品。但是下次抓这个网站,我怎么知道要停在哪里?我无法停止在我的数据库中已有的第一条记录,因为这可能会突然出现在第一页,因为有新的回复。

通常每个记录都有一个唯一的链接(永久链接),例如只需输入https://stackoverflow.com/questions/39805237/&忽略了那之外的文本。您必须为每条记录存储唯一的URL,并在下次刮擦时忽略您已有的URL。

如果您在Stackoverflow上采用标记python的示例,则可以在此处查看问题:https://stackoverflow.com/questions/tagged/python但不能依赖排序顺序来确保唯一条目。刮痧的一种方法是按最新问题排序,并通过其URL忽略重复的问题。

您可以使用一种算法,每隔“x”分钟就会抓取第一个“n”页,直到它到达现有记录。整个流程有点特定于站点,但随着您搜索更多站点,您的算法将变得更加通用和强大,以处理边缘案例和新站点。

另一种方法是不自己运行scrapy,而是使用分布式蜘蛛服务。它们通常具有多个IP,并且可以在几分钟内捕获大型站点。只需确保您尊重网站的robots.txt文件,并且不要意外DDoS。