我正在用python编写一个简单的网络爬虫,我不想创建一个简单的queue类,但我不太确定最好的开始方法。我想要的东西,只持有唯一的项目来处理,这样爬虫将只抓取每一页每次脚本运行一次(只是为了避免无限循环)。有没有人能给我一个简单的队列示例?
发布于 2009-02-14 18:48:41
我只是使用了一个集合,它不会维护顺序,但它会帮助你保持唯一性:
>>> 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]发布于 2009-02-14 18:57:17
一个非常简单的例子是将每个条目的URL填充到字典中,但作为键,而不是值。然后,如果下一项的url不在该dict的键中,则只处理它:
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当然,您可以获得更高的效率,但这将是简单的。
发布于 2009-02-14 19:10:32
如果我理解正确的话,您希望每个页面只访问一次。我认为最好的方法是保留一个仍然要访问的页面队列,以及一组已访问的页面。另一个发布的解决方案的问题是,一旦你从队列中弹出一个页面,你就不再有你是否去过那里的记录。
我会使用set和list的组合:
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)当然,这有点做作的例子,您最好以某种方式封装它,但它说明了这个概念。
https://stackoverflow.com/questions/549536
复制相似问题