实战:总结知识点疫情爬虫
- Re正则表达式
- Re库的使用
- scrapy爬虫框架介绍
- Scrapy常用命令
- 网络爬虫
技术亮点:
1、采用requests发送请求,获取响应
2、采用BeautifulSoup4解析页面数据
3、采用正则表达式 提取不规则字符串
4、采用json模块处理json格式数据
5、采用 类封装爬虫项目代码
6、对爬虫项目代码进行重构,提高代码扩展性和复用性
网络爬虫的概念
1、网络爬虫和浏览器的区别:浏览器是展示数据的,而网络爬虫是采集数据的
2、定义:模拟客户端发送请求获取响应数据,按照一定规则,自动从万维网上获取信息的程序
3、作用:从万维网上,获取我们需要的信息
requests使用三步骤:
1、导入模块
2、发送get请求,获取响应
3、从响应中获取数据
response常见属性:
response.text:响应str类型
response.encoding:二进制转换字符使用的编码
response.content:响应体bytes类型
BeautifulSoup对象介绍与创建
BeautifulSoup介绍:
BeautifulSoup是一个可以从HTML或xml文件中提取数据的python库
BeautifulSoup安装:
安装:pip install bs4
安装lxml:pip install lxml
BeautifulSoup对象:代表要解析珍格格文档树,它支持遍历文档树和搜索文档树中描述的大部分的方法。
BeautifulSoup对象的find方法
find方法的作用:搜索文档树
find(self,name=None,attrs=[],recursive=True,text=None,**kwargs)
参数:
name:标签名
attrs:属性字典
recursive:是否递归循环查找
text:根据文本内容查找
返回:
查找到第一个元素对象
Tag对象介绍:Tag对象对应于原始文档中的xml或HTML标签。Tag有很多方法和属性,可用遍历文档树和搜索文档树以及获取标签内容。
Tag对象常见属性:
name:获取标签名称
attrs:获取标签所有属性的键和值
text:获取标签的文本字符串
正则表达式的概念和作用
概念:正则表达式是一种字符串匹配的模式
作用:
检查一个字符串是否含有某种子串;
替换匹配的子串;
提取某个字符串中匹配的子串
re.findall()方法
API
re.findall(pattern,string,flags=0)[重点]
作用:扫描整个string字符串,返回所有与pattern匹配的列表
参数:
pattern:正则表达式
string:要查找的字符串
flags:匹配模式
返回:返回string中与pattern匹配的结果列表
findall()特点:(切记)
如果正则表达式中没有()则返回与整个正则匹配的列表;
如果正则表达式中有(),则返回()中匹配的内容列表,小括号两边的东西都是负责确定提取数据所在位置。
json模块介绍
json模块是python自带的模块,用于json与python数据之间的相互转换;
笔记总结:中国大学MOOC
python网络信息爬虫与信息提取
1、Requests:自动爬取HTML页面,自动网络请求提交
2、BeautifulSoup:解析页面
3、Re:正则表达式详解,提取页面关键信息
Re正则表达式
正则表达式
(1)通用的字符串表达框架
(2)简洁表达一组字符串的表达式
(3)针对字符串表达“简洁”和“特征”思想的工具
(4)判断某字符串的特征归属
正则表达式在文本处理中十分常用
(1)表达文本类型的特征(病毒、入侵等)
(2)同时查找或替换一组字符串
(3)匹配字符串的全部或部分
正则表达式的使用
编译:将符合正则表达式语法的字符串转换成正则表达式特征
正则表达式的语法:正则表达式语法由字符和操作符构成
正则表达式的常用操作符
操作符 | 说明 | 实例 |
. | 表示任何单个字符 | |
[ ] | 字符集,对单个字符给出取值范围 | [abc]表示a、b、c,[a-z]表示a到z单个字符 |
[^ ] | 非字符集,对单个字符给出排除范围 | [^abc]表示非a或b或c的单个字符 |
* | 前一个字符0次或无限次扩展 | |
+ | 前一个字符1次或无限次扩展 | |
? | 前一个字符0次或1次扩展 | |
或(无法用字符表示出来) | 左右表达式任意一个 | |
{m} | 扩展前一个字符m次 | ab{2)c表示abbc |
{m,n} | 扩展前一个字符m至n次 (含n) | ab{1,2}c表示abc/abbc |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串的结尾 |
() | 分组标记,内部只能使用“或”操作符 | |
\d | 数字,等价于[0-9] | |
\w | 单词字符,等价于[A-Za-z0-9_] |
Re库的使用
Re库是python的标准库,主要用于字符串匹配
调用方式:import Re
正则表达式的表示类型
raw string类型(原生字符串类型)
re库采用raw string类型表示正则表达式,表示为r’text’
例如:r’[1-9]\d{5} ’
raw string 是不包含转义符的字符串
String类型 ,更繁琐
当正则表达式包含转义符时,使用raw string(原生字符串)
Re库主要功能函数
函数 | 说明 |
re.search() | 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 |
re.match() | 从一个字符串的开始位置起匹配正则表达式,返回match对象 |
re.findall() | 搜索字符串,以列表类型返回全部能匹配的子串 |
re.split() | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer() | 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 |
re.sub() | 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
regex = re.compile(pattern, flags=0)
将正则表达式的字符串形式编译成正则表达式对象
pattern:正则表达式的字符串或原生字符串表示
flags:正则表达式使用时的控制标记
regex = re.compile(r’[1-9]\d{5}')
Re库的match对象:一次匹配的结果
属性 | 说明 |
.string | 待匹配的文本 |
.re | 匹配时使用的pattern对象(正则表达式) |
.pos | 正则表达式搜索文本的开始位置 |
.endpos | 正则表达式搜索文本的结束位置 |
方法 | 说明 |
.group() | 获得匹配后的字符串 |
.start() | 匹配字符串在原始字符串的开始位置 |
.end() | 匹配字符串在原始字符串的结束位置 |
.span() | 返回(.start(),.end()) |
Re库的贪婪匹配和最小匹配
贪婪匹配:Re库默认采用贪婪匹配,即输出匹配最长的子串。
最小匹配
操作符 | 说明 |
*? | 前一个字符0次或无限次扩展,最小匹配 |
+? | 前一个字符1次或无限次扩展,最小匹配 |
?? | 前一个字符0次或1次扩展,最小匹配 |
{m,n}? | 前一个字符m至n次(含n),最小匹配 |
scrapy爬虫框架介绍
scrapy:功能强大的爬虫框架
爬虫框架:爬虫框架是实现爬虫功能的一个软件结构和功能组件集合。
爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫。
Engine:控制所有模块之间的数据流;不需要用户修改;根据条件触发事件。
Downloader:根据请求下载网页;不需要用户修改;
Scheduler:对所有爬取请求进行调度管理;不需要用户修改。
Downloader Middleware
目的:实施Engine、Scheduler和Downloader之间进行用户可配置的控制;
功能:修改、丢弃、新增请求或响应
用户可以编写配置代码。
Spdier
解析Downloader返回的响应(Response)
产生爬取项(scrped item)
产生额外的爬取请求(Request)
需要用户编写配置代码
Item piplines
以流水线的方式处理spider产生的爬取项
由一组操作顺序组成,类似流水线,每个操作是一个Item Pipline类型。
可能操作包括:清理、检验和查重爬取项中的HTML数据,将数据存储到数据库。
需要用户编写配置代码。
Spider Middleware
目的:对请求和爬取项的再处理
功能:修改、丢弃、新增请求和爬取项
用户可以编写配置代码
requests库和scrapy比较
相同点:两者都可以进行页面请求和爬取,python爬虫的两个重要技术路线。
两者可用性都好,文档丰富,入门简单。
两者都没有处理js、提交表单、应对验证码等功能(可扩展)。
requests VS scrapy
requests | scrapy |
页面级爬虫 | 网站级爬虫 |
功能库 | 框架 |
并发性考虑不足,性能较差 | 并发性好,性能较高 |
重点在于页面下载 | 重点在于爬虫结构 |
定制灵活 | 一般定制灵活,深度定制困难 |
上手十分简单 | 入门稍难 |
选用哪个技术路线开发爬虫?
非常小的需求,requests库;
不太小的需求,Scrapy框架;
定制程度很高的需求(不考虑规模),自搭框架,requests>Scrapy
Scrapy常用命令
Scrapy命令行
Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行。
Scrapy命令行格式
scrapy[options][args]
Scrapy常用命令
命令 | 说明 | 格式 |
startproject | 创建一个新工程 | scrapy startproject[dir] |
genspider | 创建一个爬虫 | scrapy genspider[options] |
settings | 获取爬虫配置信息 | scrapy settings[options] |
crawl | 运行一个爬虫 | scrapy crawl |
list | 列出工程中所有爬虫 | scrapy list |
shell | 启动URL调试命令行 | scrapy shell[url] |
Scrapy爬虫的命令行逻辑
为什么Scrapy采用命令行创建和运行爬虫?
命令行(不是图形界面)更容易自动化,适合脚本控制。
本质上,Scrapy是给程序员用的,功能(而不是界面)更重要。
生成器的使用一般与循环搭配在一起
Scrapy爬虫的使用步骤
步骤1:创建一个工程和Spider模板
步骤2:编写Spider
步骤3:编写item pipeline
步骤4:优化配置策略
Scrapy爬虫的数据类型
Request类
Response类
Item类
Request类
class scrapy.http.Request()
Request对象表示一个HTTP请求。
由Spider生成,由Downloader执行。
Response类
class scrapy.http.Response()
Response对象表示一个HTTP响应
由Downloader生成,由Spider处理
Item类
class scrapy.item.Item()
Item对象表示一个从HTML页面中提取的信息内容
由Spider生成,由Item Pipeline处理
Item类似字典类型,可以按照字典类型操作Scrapy爬虫提取信息的方法
Scrapy爬虫支持多种HTML信息提取方法
Beautiful Soup
Lxml
re
XPath Selector
CSS Selector
网络爬虫
(1)检查 robots.txt协议;如:http://www.aobosir.com/robots.txt
(2)检查 网站地图 Sitemap
(3)查看网站所有者
安装相应的模块:pip install python-whois
import whois
print(whois.whois('www.baidu.com'))
(4)from urllib import robotparser解析robots协议
(5)查看网站大小:site:http://www.baidu.com
如:
(6)使用builtwith识别网站所用技术
import builtwith
builtwith.parse("http://www.baidu.com")
拓展:Numpy库、Matplotlib库、Pandas库