首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单唯一非优先级排队系统

简单唯一非优先级排队系统
EN

Stack Overflow用户
提问于 2009-02-14 18:44:54
回答 5查看 2.1K关注 0票数 1

我正在用python编写一个简单的网络爬虫,我不想创建一个简单的queue类,但我不太确定最好的开始方法。我想要的东西,只持有唯一的项目来处理,这样爬虫将只抓取每一页每次脚本运行一次(只是为了避免无限循环)。有没有人能给我一个简单的队列示例?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-14 18:48:41

我只是使用了一个集合,它不会维护顺序,但它会帮助你保持唯一性:

代码语言:javascript
运行
复制
>>> q = set([9, 8, 7, 7, 8, 5, 4, 1])
>>> q.pop()
1
>>> q.pop()
4
>>> q.pop()
5
>>> q.add(3)
>>> q.add(3)
>>> q.add(3)
>>> q.add(3)
>>> q
set([3, 7, 8, 9]
票数 4
EN

Stack Overflow用户

发布于 2009-02-14 18:57:17

一个非常简单的例子是将每个条目的URL填充到字典中,但作为键,而不是值。然后,如果下一项的url不在该dict的键中,则只处理它:

代码语言:javascript
运行
复制
visited = {}
# grab next url from somewhere
if url not in visited.keys():
  # process url
  visited[url] = 1 # or whatever, the value is unimportant
# repeat with next url

当然,您可以获得更高的效率,但这将是简单的。

票数 2
EN

Stack Overflow用户

发布于 2009-02-14 19:10:32

如果我理解正确的话,您希望每个页面只访问一次。我认为最好的方法是保留一个仍然要访问的页面队列,以及一组已访问的页面。另一个发布的解决方案的问题是,一旦你从队列中弹出一个页面,你就不再有你是否去过那里的记录。

我会使用set和list的组合:

代码语言:javascript
运行
复制
visited = set()
to_visit = []

def queue_page(url):
    if url not in visited:
        to_visit.append(url)

def visit(url):
    visited.add(url)
    ... # some processing

    # Add all found links to the queue
    for link in links:
        queue_page(link)

def page_iterator(start_url):
    visit(start_url)
    try:
        yield to_visit.pop(0)
    except IndexError:
        raise StopIteration

for page in page_iterator(start):
    visit(page)

当然,这有点做作的例子,您最好以某种方式封装它,但它说明了这个概念。

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

https://stackoverflow.com/questions/549536

复制
相关文章

相似问题

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