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)
我正在写一个网络爬虫。当它访问一个页面时,它会拉取该页面上的所有链接(满足条件,等等)并将它们添加到要访问的页面队列中。我不希望爬虫访问同一个页面两次。我当前的解决方案很笨拙:访问页面时,我将 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)