有效地搜索大量URL列表

Efficiently searching a large list of URLs

本文关键字:URL 列表 搜索 有效地      更新时间:2023-10-16

我正在构建一个必须爬行数百个网站的网络爬行者。我的爬行者保留了已经爬行的URL列表。每当Crawler要爬一个新页面时,它首先搜索已经爬网的URL列表,如果已经列出了爬网手,则跳到下一个URL等。一旦URL爬行,就会添加到列表中。

当前,我正在使用二进制搜索来搜索URL列表,但是问题是一旦列表增长,搜索就会变得非常慢。因此,我的问题是,我可以使用哪种算法来搜索URL列表(列表的大小增加到约20k至100k)。

Crawler目前在Python中进行了编码。但是我要将其移植到C 或其他更好的语言。

您必须在某个时候决定要爬行的列表变成多大。您最多可以将URL存储在哈希地图或字典中,这可能会给您o(1)查找。

无论如何,平均URL长度约为80个字符(这是我五年前我运行分布式爬行者的经验),您只会获得每GB的大约1000万个URL。因此,您必须开始考虑压缩数据或允许在一段时间后重新爬行。如果您每天只添加100,000个URL,那么您将需要100天才能爬行1000万个URL。这可能是足够的时间来允许重新爬行。

如果这些是您的局限性,那么我建议由URL键入的简单词典或哈希地图。该值应包含最后的爬网日期以及您认为要保留的任何其他信息。将数据结构限制为1000万个URL。它可能会吞噬近2 GB的空间,而字典的头顶等等。

您必须定期修剪它。我的建议是要有一个计时器每天运行一次,并清理x天以上X的所有URL。在这种情况下,您可能会将X设置为100。

如果您开始谈论每天执行数百万个URL的高容量爬行者,那么您会涉及更多参与的数据结构和创新方法来管理复杂性。但是从您的问题的语气来看,这不是您感兴趣的。

我认为在将您的值放入您的二进制搜索列表之前,我认为将其值放在二进制搜索列表中 - 这将摆脱可能的字符串比较的瓶颈,交换为INT平等检查。它还可以使O(log2(n))二进制搜索时间 - 如果您在运行之间使用Python的内置hash(),则可能不会获得一致的结果,但是 - 它是特定于实现的。在运行中,这将是一致的。总是可以选择实现自己的哈希,这也可以在会话之间保持一致。