1.概述
对于轻量级爬虫:
- 只抓取静态页面
而对于高级的爬虫,需要考虑的因素就较多,如:
- 如何模拟登陆
- 验证码识别
- 分布式爬取网页
- 数据存储
- 网页更新
这些因素都具有重要的现实意义,但是对于初学者来讲,了解爬虫的基础架构显得更为必要,在实际应用场景中对其扩展可以爬取其他网页。
对于一个简单的爬虫架构,它包含了以下三大模块:
<font color=#FF4500>URL管理器:</font> 用来管理将要抓取的URL和已经抓取过的URL
<font color=#FF4500>HTML下载器:</font>给定一个URL,需要将其网页下载到本地后才能进行后续的分析。(这里使用Python自带的urllib2模块)
<font color=#FF4500>HTML解析器:</font>得到了网页的内容以后,我们需要对其进行解析才能提取出我们想要的、我们感兴趣的内容。(这里使用Python的第三方插件BeautifulSoup)
2.爬虫架构:
<font color=#FF4500>爬虫调度端:</font>
启动爬虫、停止爬虫或者监视爬虫的运行情况
而在爬虫程序中有三个模块:
<font color=#FF4500>URL管理器:</font>对将要抓取的URL和已经抓取过的URL进行管理。我们可以取出一个将要爬取的URL传送给<font color=#FF4500>HTML下载器:</font>,下载器会将URL指定的网页下载下来,存储成一个字符串,这个字符串会传送给<font color=#FF4500>HTML解析器:</font>进行解析,一方面会解析出有价值的数据,另一方面每一个网页会有许多指向其他网页的URL,这些URL被解析出来以后可以补充进URL管理器。
URL管理器、HTML下载器和HTML下载器会形成一个循环,只要有相关联的URL就会一直运行下去。以上这些模块就组成了这个简单的爬虫架构。这个架构就可以把互联网上的相关所有网页下载下来。
爬虫运行流程:
下图以时序图的方式给出了爬虫架构的运行流程
3.URL管理器
- URL管理器:管理待抓取URL集合和已抓取URL集合
- 防止重复抓取、防止循环抓取
URL管理器功能
Python爬虫URL管理器实现方式
4.HTML下载器
HTML下载器简介
HTML下载器:将互联网上URL上对应的网页下载到本地的工具。可以说HTML下载器是爬虫的核心组件
Python有哪几种网页下载器?
<font color=#FF4500>urllib2</font>是Python官方的基础模块,支持直接的URL下载,或者向网页提供需要用户输入的数据,甚至支持需要登录网页的cookie处理,需要代理访问的代理处理等这些增强功能
<font color=#FF4500>requests</font>是Python的第三方插件,它提供更为强大的功能
这里使用urllib2.
urllib2下载网页的三种方法
1.最简洁方法
给定一个url,将其传送给urllib2模块的urlopen()方法,即:urllib2.urlopen(url)
对应到代码:
import urllib2
# 直接请求
response=urllib2.urlopen('http://www.baidu.com')
# 获取状态码,如果是200表示获取成功
print response.getcode()
# 读取内容
cont=response.read()```
**2.添加data、http header**
![方法2](http://upload-images.jianshu.io/upload_images/3480470-7cdf6be81b2e6df3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
对应到代码:
import urllib2
创建Request对象
request=urllib2.Request(url)
添加data
request.add_data('a','1')
添加http的header
request.add_header('User-Agent','Mozilla/5.0')
发送请求获取结果
response=urllib2.urlopen(request)```
3.添加特殊情景的处理器
例如,增强cookie的处理,对应到代码:
import urllib2,cookielib
# 创建cookie容器
cj=cookielib.CookieJar()
# 创建一个opener
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# 给urllib2安装opener
urllib2.install_opener(opener)
# 使用带有cookie的urllib2访问网页
reponse=urllib2.urlopen("http://www.baidu.com/")```
以上三种方法都实现了网页的下载,但是每一种方法都比前一种方法有更大的更强的功能处理。
### 5.HTML解析器和BeautifulSoup第三方模块
>#### HTML解析器
HTML解析器:从网页中提取有价值数据的工具
![网页解析器](http://upload-images.jianshu.io/upload_images/3480470-21afe8826281ba9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Python有哪几种HTML解析器?
![HTML解析器分类](http://upload-images.jianshu.io/upload_images/3480470-ab5a1e42c60da28a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- **结构化解析-DOM(Document Object Model)树**
![DOM树.png](http://upload-images.jianshu.io/upload_images/3480470-e5138777c3844bb9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>#### Beautiful Soup
- Python第三方库,用于从HTML或XML中提取数据
- 官网:http://www.crummy.com/software/BeautifulSoup/
- 安装并测试beautifulsoup4
- 安装:pip install beautifulsoup4
- 测试:import bs4
- Beautiful Soup-语法
![Beautiful Soup-语法](http://upload-images.jianshu.io/upload_images/3480470-cbdbe787de89ceb1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
例如:
![举例](http://upload-images.jianshu.io/upload_images/3480470-b8106c578b037fea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
对应到代码:
- 创建BeautifulSoup对象
form bs4 import BeautifulSoup
根据HTML网页字符串创建BeautifulSoup对象
soup=BeautifulSoup(
html_doc, #HTML文档字符串
'html.paser' #HTML解析器
from_encoding='utf8' #HTML文档的编码
)```
- 搜索节点(find_all,find)
# 方法:find_all(name,attrs,string)
# 查找所有标签为a的节点
soup.find_all('a')
# 查找所有标签为a,链接符合/view/123.htm形式的节点
soup.find_all('a',href='/view/123.htm')
soup.find_all('a',href=re.compile(r'/view/\d+\.htm'))
# 查找所有标签为div,class为abc,文字为Python的节点
soup.find_all('div',class_='abc',string='Python')```
- 访问节点信息
得到结点:<a href='1.html'> Python </a>
获取查找到的节点的标签名称
node.name
获取查找到的a结点的href属性
node['href']
获取 查找到的a结点的链接文字
node.get_text()```
** 通过以上创建BS对象、搜索DOM树、访问节点的内容,就可以实现对整个下载好的网页所有节点的解析、访问。**
6.实例
这里爬取的是百度百科Python词条相关的1000个页面数据,(本实例来源于慕课网教程)。
然后将这些数据写出到一个HTML5页面中,打开这个页面就可以看到我们已经爬取好的数据。
代码我已经敲了一遍,在Python3 版本亲测可执行,可以在我的GitHub获取。
爬取结果如下图: