之所以称之为爬虫(Web Carwler)是因为它们可以沿着网络爬行。它们的本质就是一种递归方式。为了找到URL链接,它们必须首先获取网页内容,检查这个页面的内容,在寻找另外一个URL,然后后获取URL对应的网页内容,不断循环这一过程。不过要注意的是:你可以这样重复采集网页,但不意味着你一直都应该这么做。当你需要的所有数据都在一个页面上时,前面例子中的爬虫就足以解决问题了。使用网络爬虫的时候,你必须非常谨慎地考虑需要消耗多少网络流量,还要经历思考能不能让采集目标服务器负载更低一些。
在本篇博文中,我们将创建一个项目来实现“维基百科六度分隔理论”的查找方法。也就是说,我们要实现从埃里克.艾德尔的词条页面(https://en.wikipedia.org/wiki/Eric_Idle)开始,经过最少的链接点击找到凯文.贝肯的词条界面(https://en.wikipedia.org/wiki/Kevin_Bacon)。
你应该已经知道如何写一段获取维基百科网站任何页面并提取页面链接的Python代码了:
from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen("https://en.wikipedia.org/wiki/Eric_Idle")
bsObj=BeautifulSoup(html,"html.parser")
for link in bsObj.findAll("a"):
if 'href' in link.attrs:
print(link.attrs['href'])
你会发现结果为一系列的链接,其中有些是我们需要的,有些不是我们需要的。其实维基百科的每个页面都充满了侧边栏、页眉、页脚链接,以及连接到分类页面、对话页面和其他不包含词条的页面的链接。经过对采集页面的分析,发现那些指向词条页面(不是指向其他内容页面