我用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的最佳方法是什么?
答案 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())