网络爬虫,之所以称之为爬虫,是因为它们可以沿着网络爬行,它们的本质就是一种递归方式。为了找到URL连接,它们必须首先获得网页内容,检查页面的内容。寻找另一个URL,获取这一个URL的内容,不断重复这一过程。
1.遍历单个域名
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re
#使用时间产生随机数
random.seed(datetime.datetime.now())
#定义getlinks函数,遍历页面生成link函数序列
def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html)
return bsObj.find("div", {"id":"bodyContent"}).findAll("a",href=re.compile("^(/wiki/)((?!:).)*$"))
#主函数,传入参数/wiki/Kevin_Bacon,定义首页
links = getLinks("/wiki/Kevin_Bacon")
#使用随机数随机选择一个link进行爬行
while len(links) > 0:
newArticle = links[random.randint(0, len(links)-1)].attrs["href"]
print(newArticle)
links = getLinks(newArticle)
2.采集整个网站
上面的程序主要分为三个部分: 1.定义pages为一个空集合
2.定义一个函数:
- 声明全局变量pages
- 提取网页html代码给变量html
- 使用beautifulsoup格式化组织html
- 遍历每个找到的给定格式的link
- 判断link存在href属性
- 判断href属性的值在不在pages集合中
- 发现了新页面,把href的值传给newPage
- 输出newPage
- 把新的连接加入pages集合zhong
- 调用函数遍历新页面
3.主函数,处理一个空页面,实际是维基百科的首页,然后调用getlink函数遍历网页上的每个连接。
注:上面程序是一个递归的程序,python默认递归层数是1000次,达到次数后停止。我们可以写一个非递归的程序,可以把所有新页面加入集合,每次都从集合中随机提取一个页面遍历,然后删除,再随机提取一个页面,当然,这样的话,页面过多时可能会造成集合过大,可以使用巧妙的方法解决问题。
3.通过互联网采集数据
可以说,你用你的电脑和一个python代码就可以建立一个谷歌--当然是1994年的谷歌。谷歌最有价值的资源就是存储在世界各地的超大规模的数据仓库。这是谷歌无数爬虫无数个日日夜夜的成果。然而现有网络世界仍有90%的网络资源是谷歌爬虫没有到达的,有兴趣的朋友可以了解一下深网和暗网。
4.用scrapy进行数据采集
参见:http://my.oschina.net/clgo/blog/649088