网站抓取中的顺序与混乱:Marginalia 搜索引擎的 Crawl 优化
Crawl Order and Disorder
发布时间: 2025-03-27 标签: search-engine
一段时间以来,搜索引擎的 crawler 一直面临一个问题,那就是完成抓取任务需要相当长的时间,通常需要几天才能完成最后几个域名的抓取。
最近,这个问题变得更加明显,因为迁移到 slop crawl 数据后,crawler 的内存需求减少了大约 80%。因此,我增加了抓取任务的数量,导致出现了一种奇怪的情况:99.9% 的抓取在 4 天内完成,而剩余的 0.1% 却需要一周的时间。
这种情况发生的原因有几个,部分原因是网站的大小似乎遵循 pareto 分布,有些网站非常庞大,但也因为 crawler 限制了每个通用域名允许的并发抓取任务数量。
设置此限制是为了避免因通过不同的别名抓取同一站点而意外超过抓取速率。而且,为了避免被某些域名上的反 crawler 软件阻止,这种限制也是绝对必要的,尤其是在学术界,它们往往拥有大量的子域名,而这些子域名通常由少量相对较弱的机器提供服务。它们还倾向于托管一些最大的网站,通常包含成千上万甚至数十万个文档。
此限制根据域名而异,某些较大的博客主机具有非常宽松的限制,而 edu
和 gov
域名往往具有最严格的限制。
最初的抓取顺序是随机的。对域名进行洗牌是为了确保,如果 crawler 最终因为某些不幸的抓取顺序而给网站带来问题(例如,通过域名别名),或者 crawler 耗尽了内存(这已不再是问题),这种情况不会每次都重复发生。
但在实践中,最终发生的情况是,由于运气不佳以及域名限制的推动,较大(通常是学术)的域名通常启动较晚。
由于抓取这些网站需要花费大量时间,因此最好尽快启动它们,而不是随机选择顺序。
下一个想法是按域名名称的子域名数量对抓取任务进行排序,然后使用随机排序作为决胜因素。
但这并没有达到预期的效果。
这种改变最终产生了一种霰弹枪效应,以 1 秒的间隔向一个博客主机发送数十个并发请求,因为许多抓取任务同时启动,并且在 robots.txt
中给出了相同的抓取延迟指令。
糟糕!
为了避免这种不幸的模式,我在请求之间的延迟中添加了一些抖动。这使得即使同时启动多个抓取任务,请求时序也会分开。
我还更改了排序顺序,不再严格按照子域名数量对域名进行排序,而是按它们是否拥有超过 8 个子域名进行排序,以便获得更好的混合效果。毕竟,我们的目的从来都不是优先抓取博客主机,而是抓取学术网站。
这种修改后的更改似乎有效,并且首先安排最慢的抓取任务。虽然它不会完全解决问题,这个问题部分是搜索引擎使用的批处理抓取模型的必然结果,但它至少可以更好地利用 crawler 的运行时。
对此的进一步优化还可以包括存储有关上次运行抓取任务所花费时间的信息,并根据该信息对任务进行排序,尽管目前无法获得此信息,但可以使用历史抓取数据的磁盘大小来近似估计此信息。
上一篇:
Marginalia Search receives second nlnet grant| 2025-03-25 marginalia.nu © 2025 Viktor Lofgren kontakt@marginalia.nu 请考虑捐赠 以支持 Marginalia Search 和其他服务的开发工作!