我正在编写一个网络爬虫,最终目标是创建爬虫所走路径的地图。虽然我不知道其他爬虫以多快的速度抓取页面,但我的爬虫每分钟大约有2000页。
爬虫使用递归回溯算法,我将其深度限制为15。此外,为了防止爬虫无休止地修改页面,它将访问过的每个页面的url存储在一个列表中,并检查该列表中是否有下一个候选url。
for href in tempUrl:
...
if href not in urls:
collect(href,parent,depth+1)
当这种方法被拉下大约300,000页时,它似乎成了一个问题。在这一点上,爬虫的平均速度是每分钟500页。
所以我的问题是,在提高效率的同时实现相同功能的另一种方法是什么。
我认为减小每个条目的大小可能会有所帮助,所以我没有附加整个url,而是将前两个和最后两个字符作为字符串附加到每个url的字符。然而,这并没有帮助。
有没有办法我可以用套装或其他东西来做这个?
谢谢你的帮助
编辑:顺便说一下,我的程序还不是多线程的。我认为在我开始学习线程之前,我应该解决这个瓶颈。
发布于 2011-06-29 00:17:18
也许您可以使用代替您到目前为止所见过的urls的。
发布于 2011-06-29 00:20:09
只需将你的“爬行urls列表”替换为“爬行urls的set
”。集合针对随机访问进行了优化(使用与字典使用的相同的散列算法),它们的速度快得多。列表的查找操作是使用线性搜索完成的,所以它不是特别快。你不需要更改执行查找的实际代码。
看看这个。
In [3]: timeit.timeit("500 in t", "t = list(range(1000))")
Out[3]: 10.020853042602539
In [4]: timeit.timeit("500 in t", "t = set(range(1000))")
Out[4]: 0.1159818172454834
发布于 2011-06-29 00:19:28
我也遇到过类似的问题。最终分析了内存与时间的各种方法(list/file/sets/sqlite)。看看这两篇文章。最后,sqlite是最佳选择。您还可以使用url散列来减小大小。
Searching for a string in a large text file - profiling various methods in python
sqlite database design with millions of 'url' strings - slow bulk import from csv
https://stackoverflow.com/questions/6509647
复制相似问题