×

Python开发轻量级爬虫

96
victorsungo
2016.11.11 17:02* 字数 1181

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管理器功能

URL管理器功能

Python爬虫URL管理器实现方式

URL管理器的实现方式

4.HTML下载器

HTML下载器简介

HTML下载器:将互联网上URL上对应的网页下载到本地的工具。可以说HTML下载器是爬虫的核心组件


HTML下载器
  • Python有哪几种网页下载器?

  • <font color=#FF4500>urllib2</font>是Python官方的基础模块,支持直接的URL下载,或者向网页提供需要用户输入的数据,甚至支持需要登录网页的cookie处理,需要代理访问的代理处理等这些增强功能

  • <font color=#FF4500>requests</font>是Python的第三方插件,它提供更为强大的功能

HTML下载器分类

这里使用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获取。
爬取结果如下图:

blog
Web note ad 1