如何在我的python spider程序中避免重复下载URL?
我用python编写了一个spider程序。它可以递归地抓取网页。我希望避免下载相同的页面,因此我将URL存储在一个列表中,如下所示:如何在我的python spider程序中避免重复下载URL?,python,web-crawler,Python,Web Crawler,我用python编写了一个spider程序。它可以递归地抓取网页。我希望避免下载相同的页面,因此我将URL存储在一个列表中,如下所示: urls = [] def download(mainPage): # mainPage is a link global urls links = getHrefLinks(mainPage) for l in links: if l not in urls: urls.append(l)
urls = []
def download(mainPage): # mainPage is a link
global urls
links = getHrefLinks(mainPage)
for l in links:
if l not in urls:
urls.append(l)
downPage(l)
但有一个问题是,当链接太多时,URL将非常大,如果不在URL中,代码的效率很低。如何解决这个问题?在不占用太多内存的情况下避免重复下载URL并提高效率的最佳方法是什么?您可以将URL制作成:
对象的查找,即s
中的x的复杂性为O(1),这比列表
的平均情况要好。一般来说,当您迭代URL结果时,可以将其存储在字典中。
这个字典的键是url,如果您以前见过url,那么这个值可以是布尔值。最后,打印这个dict的密钥,它将拥有所有唯一的URL
此外,通过dict进行查找将为您在检查URL是否已被看到时提供O(1)时间
# Store mapping of {URL: Bool}
url_map = {}
# Iterate over url results
for url in URLs:
if not url_map.get(url, False):
url_map[url] = True
# Values of dict will have all unique urls
print(url_maps.keys())
使URL
aset
:也许值得一看Scrapy:它可以爬行,而无需多次下载相同的页面、多线程以及大量其他内容。谢谢:-)@AlexWoolford
# Store mapping of {URL: Bool}
url_map = {}
# Iterate over url results
for url in URLs:
if not url_map.get(url, False):
url_map[url] = True
# Values of dict will have all unique urls
print(url_maps.keys())