如何进行增量抓取RealTim附近的大型站点

2024-06-06 10:05:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想搜集很多(几百个)网站,基本上都像公告板。其中一些规模非常大(高达150万),而且增长非常迅速。我想达到的目标是:

  • 清除所有现有条目
  • 几乎实时地刮取所有新条目(最好间隔1小时或更短)

为此,我们使用scrapy并将项目保存在postresql数据库中。现在的问题是,我如何确保我得到了所有的记录,而不必每次都刮去整个网站?(这对交通来说不是很拥挤,但也不可能在1小时内完成。)

例如:我有一个网站,有100页,每10条记录。所以我刮了第一页,然后转到第二页。但是在快速增长的网站上,当我请求第2页时,可能会有10个新记录,所以我会再次得到相同的项目。尽管如此,我最终还是会得到所有的东西。但是下一次抓取这个网站时,我怎么知道该停在哪里?我不能停在数据库中已有的第一条记录,因为这可能会突然出现在第一页上,因为有一个新的答复。在

太长了,读不下去了,我不知道我是不是已经得到了我的观点,但是TL;DR:如何以渐进的方式获取快速增长的BBS?所以在获取所有记录的同时,每次只获取新记录。我查看了scrapy的resume函数和scratingubs deltafetch中间件,但我不知道它们是否(以及如何)帮助解决这个问题。在


Tags: 项目数据库目标间隔网站记录条目公告
1条回答
网友
1楼 · 发布于 2024-06-06 10:05:54

For example: I have a site with 100 pages and 10 records each. So I scrape page 1, and then go to page 2. But on fast growing sites, at the time I do the request for page 2, there might be 10 new records, so I would get the same items again. Nevertheless I would get all items in the end. BUT next time scraping this site, how would I know where to stop? I can't stop at the first record I already have in my database, because this might be suddenly on the first page, because there a new reply was made.

通常每个记录都有一个唯一的链接(permalink),例如,只需输入https://stackoverflow.com/questions/39805237/&忽略除此之外的文本即可访问上述问题。你必须为每一条记录存储唯一的URL,当你下次进行抓取时,忽略你已经拥有的那些。在

如果您以Stackoverflow上的标记python为例,您可以在这里查看问题:https://stackoverflow.com/questions/tagged/python,但是不能依赖排序顺序来确保条目的唯一性。其中一种方法是根据最新的问题进行排序,并根据URL忽略重复的问题。在

你可以有一个算法,每“x”分钟刮一次前“n”页,直到它碰到现有记录为止。整个流程有点特定于站点,但是随着您获取更多站点,您的算法将变得更加通用和健壮,以处理边缘情况和新站点。在

另一种方法是不自己运行scrapy,而是使用分布式spider服务。它们通常有多个IP,可以在几分钟内搜索大型站点。只要确保你尊重网站的机器人.txt归档,不要意外地对它们进行DDoS攻击。在

相关问题 更多 >