首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"in“的有效替代

"in“的有效替代
EN

Stack Overflow用户
提问于 2011-06-29 00:14:45
回答 4查看 223关注 0票数 4

我正在编写一个网络爬虫,最终目标是创建爬虫所走路径的地图。虽然我不知道其他爬虫以多快的速度抓取页面,但我的爬虫每分钟大约有2000页。

爬虫使用递归回溯算法,我将其深度限制为15。此外,为了防止爬虫无休止地修改页面,它将访问过的每个页面的url存储在一个列表中,并检查该列表中是否有下一个候选url。

代码语言:javascript
运行
复制
for href in tempUrl:
    ...
    if href not in urls:
         collect(href,parent,depth+1)

当这种方法被拉下大约300,000页时,它似乎成了一个问题。在这一点上,爬虫的平均速度是每分钟500页。

所以我的问题是,在提高效率的同时实现相同功能的另一种方法是什么。

我认为减小每个条目的大小可能会有所帮助,所以我没有附加整个url,而是将前两个和最后两个字符作为字符串附加到每个url的字符。然而,这并没有帮助。

有没有办法我可以用套装或其他东西来做这个?

谢谢你的帮助

编辑:顺便说一下,我的程序还不是多线程的。我认为在我开始学习线程之前,我应该解决这个瓶颈。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-29 00:17:18

也许您可以使用代替您到目前为止所见过的urls的。

票数 15
EN

Stack Overflow用户

发布于 2011-06-29 00:20:09

只需将你的“爬行urls列表”替换为“爬行urls的set”。集合针对随机访问进行了优化(使用与字典使用的相同的散列算法),它们的速度快得多。列表的查找操作是使用线性搜索完成的,所以它不是特别快。你不需要更改执行查找的实际代码。

看看这个。

代码语言:javascript
运行
复制
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
票数 7
EN

Stack Overflow用户

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6509647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档