如何在我的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)

我用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)
            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
a
set
:也许值得一看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())