python开发简单爬虫:准备篇
这篇博客是用于记录自己学习python爬虫的过程,以下内容是看过慕课网python开发简单爬虫之后自己整理的一些东西,防止自己忘记。
1. 简单的爬虫架构
1.1 架构图
一个简单爬虫的架构图如下所示:
其中爬虫调度端用来启动爬虫、停止爬虫或者监视爬虫的运行情况;URL管理器是对将要爬取的URL和已经爬取的URL进行管理;从URL中取出一个待爬取的URL,将其传送给网页下载器,网页下载器会将指定的URL网页下载下来,存储成一个字符串;这个字符串会传送给网页解析器进行解析,网页解析器将会解析出有价值的数据传送给应用程序,将解析出的有用的URL传送给URL管理器。以上这些模块就组成了一个简单的爬虫架构。
1.2 时序图
简单爬虫架构的动态运行流程如下图所示:
2. URL管理器
URL管理器:管理待爬取的URL集合和以爬取的URL集合。作用是防止重复爬取和循环爬取。
一个URL管理器应该具有以下几个功能:
- 添加新的URL到待爬取集合中;
- 判断待添加的URL是否在容器中;
- 获取待爬取的URL;
- 判断是否还有待爬取的URL;
将爬取后的URL从待爬取集合移动到以爬取集合。
URL管理器目前有一下三种实现方式:
- 内存
- 如python内存:待爬取URL集合set(),以爬取URL集合set();
- 关系数据库:
- 如MySQL数据库:urls(url, is_crawled);
- 缓存数据库:
- 如redis:待爬取集合set,以爬取集合set。
- 内存
3. 网页下载器
网页下载器:将互联网上URL对应的网页下载到本地的工具。
方法1:最简洁的方法
#coding:utf-8
import urllib2
#直接请求
response = urllib2.urlopen('http://www.baidu.com')
#获取状态码,如果是200表示获取成功
print response.getcode()
#读取内容
cont = response.read()
print len(cont)
方法2:添加data、http header
#coding:utf-8
import urllib2
#创建Request对象
request = urllib2.Request('http://www.baidu.com')
#添加http的header,伪装成浏览器访问
request.add_header('User-Agent', 'Mozilla/5.0')
#发送请求,获取结果
response = urllib2.urlopen(request)
#读取内容
cont = response.read()
print len(cont)
方法3:添加特殊情景的处理器
#coding:utf-8
import urllib2
import cookielib
#可以进行cookie处理
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
#直接请求
response = urllib2.urlopen('http://www.baidu.com')
#读取内容
cont = response.read()
print len(cont)
#打印cookie
print cj
4. 网页解析器
网页解析器:从网页中提取出有价值数据的工具。
python有以下几种网页解析器:正则表达式、html.parser、BeautifulSoup、lxml。
4.1 DOM树
文档树(Document Tree)是HTML页面的层级结构。它由元素、属性和文本组成,它们都是一个节点(Node)。
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>HTML DOM树型结构图</title>
</head>
<body>
<div>
<a href="http://www.baidu.com">百度首页</a>
<p>para</p>
<b>ghi</b>
</div>
</body>
</html>
根据上面的HTML文档可以绘制一个清晰的DOM结构树:
4.2 Beautiful Soup
Beautiful Soup是Python第三方库,用于从HTML或XML中提取数据。官网地址是:https://www.crummy.com/software/BeautifulSoup/。
利用python的pip指令在命令行输入:pip install beautifulsoup4
安装Beautiful Soup模块。
Beautiful Soup的语法如下:
先根据HTML文档创建一个BeautifulSoup对象,然后按节点名称、属性值或者内容搜寻节点,最后就可以访问搜寻到的节点的名称、属性、内容。在<a href="http://www.baidu.com">百度首页</a>
中节点名称是:a,节点属性是:href=”http://www.baidu.com”,节点内容是:百度首页。
代码如下:
#coding:utf-8
from bs4 import BeautifulSoup
import re
#根据HTML网页字符串创建BeautifulSoup对象
soup = BeautifulSoup(
html_doc, #HTML网页字符串
'html.parser', #HTML解析器
from_encoding='utf-8' #HTML文档的编码)
#搜索节点方法:find_all(name, attrs, string)
#查找所有标签为a的节点
soup.find('a')
#查找所有标签为a,链接符合/view/123.htm形式的节点
soup.find('a', href='/view/123.htm')
#可以传入正则表达式作为参数
soup.find('a', href=re.compile(r'/view/\d+\.htm'))
#查找所有标签为div,class为abc,文字内容为Python的节点
soup.find('div', class_='abc', string='Python')
#访问节点信息:<a href="http://www.baidu.com">百度首页</a>
#获取查找到节点的标签名称
node.name
#获取查找到的a节点的href属性
node['href']
#获取查找到的a节点的链接文字
node.get_text()
至此,要开发一个简单python爬虫的准备工作已经完成,下一步要进行的就是从python的百度百科开始爬取相关联的100个页面的标题和简介。