我希望能够递归地从一个网站获得所有链接,然后跟随这些链接,并从这些网站获得所有链接。深度应该是5-10,这样它就会返回一个包含找到的所有链接的数组。最好是用漂亮的汤/蟒蛇。谢谢!
我已经尝试了到目前为止,它不是working....any帮助将不胜感激。
from BeautifulSoup import BeautifulSoup
import urllib2
def getLinks(url):
if (len(url)==0):
return [url]
else:
files = [ ]
page=urllib2.urlopen(url)
soup=BeautifulSoup(page.read())
universities=soup.findAll('a',{'class':'institution'})
for eachuniversity in universities:
files+=getLinks(eachuniversity['href'])
return files
print getLinks("http://www.utexas.edu/world/univ/alpha/")发布于 2013-11-26 02:18:43
递归算法用于将大问题简化为具有相同结构的较小问题,然后将结果合并。它们通常由一个不会导致递归的基本情况和另一个导致递归的情况组成。例如,假设你出生于1986年,你想要计算你的年龄。你可以这样写:
def myAge(currentyear):
if currentyear == 1986: #Base case, does not lead to recursion.
return 0
else: #Leads to recursion
return 1+myAge(currentyear-1)我,我自己,真的看不出在你的问题中使用递归的意义。我的建议是首先在你的代码中设置一个限制。你给我们的东西将会无限地运行,因为程序陷入了无限嵌套的for循环中;它永远不会结束并开始返回。因此,您可以在函数外部设置一个变量,该变量在您每次下一级时都会更新,并在某一时刻停止函数启动新的for循环,并开始返回找到的内容。
但是当你开始改变全局变量时,你会以一种奇怪的方式使用递归,并且代码变得混乱。
现在阅读注释,看看你真正想要的是什么,我必须说,这并不是真的很清楚,你可以在你的代码中使用递归算法的帮助,但不是递归地编写所有的代码。
def recursiveUrl(url,depth):
if depth == 5:
return url
else:
page=urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
newlink = soup.find('a') #find just the first one
if len(newlink) == 0:
return url
else:
return url, recursiveUrl(newlink,depth+1)
def getLinks(url):
page=urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
links = soup.find_all('a', {'class':'institution'})
for link in links:
links.append(recursiveUrl(link,0))
return links现在仍然存在一个问题:链接并不总是链接到网页,而且还链接到文件和图像。这就是为什么我在'url-opening‘函数的递归部分写if/else语句的原因。另一个问题是你的第一个网站有2166个机构链接,创建2166*5的beautifulSoups并不快。上面的代码运行一个递归函数2166次。这应该不是问题,但是您正在处理大的html(或php之类的)文件,所以制作2166*5的文件需要大量的时间。
发布于 2013-11-26 02:30:35
爬行页面的数量将呈指数级增长,其中涉及的许多问题乍一看可能并不复杂,请查看scrapy体系结构概述以了解在现实生活中应该如何做

在其他强大的功能中,scrapy不会重复抓取相同的页面(除非你强制它这样做),并且可以配置为最大DEPTH_LIMIT
更棒的是,scrapy有一个内置的链接提取工具link-extractors
https://stackoverflow.com/questions/20198934
复制相似问题