如何在我的python蜘蛛程序中避免重复的下载URL?

时间:2014-11-06 03:47:45

标签: python web-crawler

我用python写了一个蜘蛛程序。它可以递归地抓取网页。我想避免下载相同的页面,因此我将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)

但是有一个问题是,当链接太多时,网址会非常大,代码if l not in urls的效率很低。如何解决问题?如果不占用太多内存并提高效率,避免重复下载URL的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以将网址设为set

urls = set()
def download(mainPage):  # mainPage is a link
    global urls
    links = getHrefLinks(mainPage)
    for l in links:
        if l not in urls:
            urls.add(l) #instead of append
            downPage(l)

对象的查找,即x in s,在average case中,复杂度为O(1),优于list的平均情况。

答案 1 :(得分:0)

通常,当您遍历URL结果时,可以将它们存储在字典中。 该词典的键是url,如果您之前看过该url,则该值可以是布尔值。最后打印此字典的键,它将具有所有唯一的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())