我在Python中编写了一个获取页面上所有链接的函数。 然后,我为第一个函数返回的所有链接运行该函数。
我的问题是,如果我继续使用CNN作为我的起点,我怎么知道我什么时候抓取了CNN的所有(或大部分)网页?
这里是抓取工具的代码。
base_url = "http://www.cnn.com"
title = "cnn"
my_file = open(title+".txt","w")
def crawl(site):
seed_url = site
br = Browser()
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.open(seed_url)
link_bank = []
for link in br.links():
if link.url[0:4] == "http":
link_bank.append(link.url)
if link.url[0] == "/":
url = link.url
if url.find(".com") == -1:
if url.find(".org") == -1:
link_bank.append(base_url+link.url)
else:
link_bank.append(link.url)
else:
link_bank.append(link.url)
if link.url[0] == "#":
link_bank.append(base_url+link.url)
link_bank = list(set(link_bank))
for link in link_bank:
my_file.write(link+"\n")
return link_bank
my_file.close()
答案 0 :(得分:1)
我没有专门查看您的代码,但您应该查看如何实现广度优先搜索,并在set
中另外存储已访问过的网址。如果您在当前访问过的网页中找到新网址,请将其附加到要访问的网址列表中,如果该网址不在set
中。
您可能需要忽略查询字符串(URL中问号后面的所有内容)。
答案 1 :(得分:1)
我想到的第一件事就是拥有set visited
个链接。每次请求链接时,请添加指向集的链接。在请求链接之前,请检查它是否在集合中。
另一点是你实际上在这里重新发明轮子,Scrapy网页抓取框架内置link extracting mechanism - 值得使用。
希望有所帮助。