Queue datastruct -- 查找队列中先前未排队的第一个元素

Queue datastruct -- find first element in queue that has not previously been queued

我正在写一个网络爬虫。当它访问一个页面时,它会拉取该页面上的所有链接(满足条件,等等)并将它们添加到要访问的页面队列中。我不希望爬虫访问同一个页面两次。我当前的解决方案很笨拙:访问页面时,我将 URL 添加到已访问页面列表中(因此从队列移动到列表)。然后,当我去访问下一个页面时,我递归地 'pop' 从队列中关闭链接,直到我得到一个不在以前访问过的页面列表中的链接。就像我说的,这看起来笨拙且效率低下,必须有更好的方法。

这是我从队列中返回第一个未访问页面的代码:

def first_new_page(queue, visited): 
    ''' 
    Given a queue and list of visited pages, returns the first unvisited URL in the queue 
    '''
    if queue.empty(): 
        return -1 
    rv = queue.get()
    if rv not in visited: 
        return rv 
    else: 
        return first_new_page(queue, visited)

您可以简单地使用 set().

已更新

好吧,在此之前我并没有真正给你一个解决方案,而是你应该如何使用 set() 的技术而不是弹出你的列表,为了完整起见,这是你想要什么:

visited = set()

queue = ['www.google.com', 'www.yahoo.com', 'www.microsfot.com']

def crawl_the_page(link):
    # ...crawling...
    visited.add(link)
    return


# you just for through the queue list
# no need to pop the list, use the set() to compare instead
for url in queue:
    if url not in visited:
        #... do your stuff ...
        #... crawl your pages ...
        crawl_the_page(url)