1. Scrapy爬虫框架
Scrapy是功能强大的网络爬虫框架
# 通过cmd的命令行安装Scrapy库
pip install -i https://mirrors.aliyun.com/pypi/simple/ scrapy
# 测试scrapy安装情况
scrapy -h
爬虫框架:实现爬虫功能的一个软件结构和功能组件合集;一个半成品,能够帮助用户实现专业的网络爬虫
1.1 Scrapy简介
Scrapy爬虫框架结构:“5+2”结构
以上5个模块形成Scrapy爬虫框架
SPIDRS是入口,需要用户编写,用来向整个框架提供url连接,同时需要解析网络内容
ITEM PIPELINES是出口,需要用户编写,负责对提取的信息进行后处理
ENGINE、SCHEDULER、DOWNLOADER是已有的功能实现,不需要编写
5个模块间,主要有3条数据流路径
第一条:
- 1:ENGINE从SPIDRS获得用户爬取的请求(url)
- 2:ENGINE将从SPIDRS获得的请求,转发给SCHEDULER(SCHEDULER赋负责对爬取请求进行调度)
第二条:- 3:ENGINE从SCHEDULER获得请求(真实的网络爬取请求)
- 4:ENGINE通过MIDDLEWARD发送给DOWNLOADER模块
- 5:DOWNLOADER模块获得请求,连接互联网,并且爬取相关网页,获得响应(RESPONSE)并传递给ENGINE
- 6:ENGINE将响应传给SPIDRS
第三条:- 7:SPIDRS处理从ENGINE获得的响应,获得2个数据类型:爬去项(ITEMS)、新爬取请求
- 8:ENGINE将ITEMS发送给ITEM PIPELINES;将新爬取请求发送给SCHEDULER进行调度
1.2 Scrapy框架解析
ENGINE:控制所有模块之间的数据流;根据条件触发事件
DOWNLOADER:根据请求下载网页
SCHEDULER:对所有爬取请求进行调度
Downloader Middleware:通过修改、丢弃、新增请求或者响应,对ENGINE、DOWNLOADER、SCHEDULER之间的数据流进行用户可配置的控制。用户可以编写配置代码
SPIDRS:解析DOWNLOADER返回的响应(Respones);产生爬取项(scraped item);产生额外的爬取请求(Request)
ITEM PIPELINES:以流水线方式处理Spider参数的爬去项;由一组操作顺序组成,类似流水线,每个操作是一个ITEM PIPELINES类型;可能的操作包括清理、检验、查重爬取项的HTML数据、将数据存储到数据库
Spider Middleware:通过修改、丢弃、新增请求或爬取项,对请求和爬取项再处理。用户可以编写配置代码
1.3 requests vs Scrapy
相同点:
- 进行页面请求和爬取,是Python爬虫的2个重要的技术路线
- 可用性号,文档丰富,入门简单
- 没有处理js、提交表单。应对验证码等功能(可扩展)
requests | Scrapy |
---|---|
页面级爬虫 | 网站级爬虫 |
功能库 | 框架 |
并发性考虑不足,性能差 | 并发性号,性能较高 |
重点在于页面下载 | 重点在于爬虫框架 |
定制灵活 | 一般定制灵活,深度定制困难 |
上手十分简单 | 入门稍难 |
如何选择:
- 非常小的需求,requests库
- 不太小的需求,Scrapy框架
- 定制程度很高(不考虑规模),自搭框架,requests库优于Scrapy
1.4 Scrapy常用命令
Scrapy是为维持运行设计的专业爬虫框架,因此提供了相关操作的Scrapy命令行
在cmd命令行中执行下列代码,打开Scrapy命令行
scrapy -h
命令 | 说明 | 格式 |
---|---|---|
startproject | 创建一个新工程 | scrapy startproject <name> [dir] |
genspider | 创建一个爬虫 | scrapy genspider [options] <name> <domain> |
settings | 获得爬虫配置信息 | scrapy settings [options] |
crawl | 运行一个爬虫 | scrapy crawl <spider> |
list | 列出工程中所有爬虫 | scrapy list |
shell | 启动URL调式命令行 | scrapy shell [url] |
2. 基本使用
2.1 简单实例
演示HTML页面地址:https://python123.io/ws/demo.html
步骤:
- 建立一个Scrapy爬虫工程
e:
cd code
acrapy startproject python123
- 在工程中产生一个Scrapy爬虫
cd python123
# 生成一个名为demo的爬虫;python123.io是网页的domain(见上述网址)
scrapy genspider demo python123.io
发现在Spider目录中出现一个名为demo.py的代码
demo.py是面向对象编码的一个类
parse()
用于处理响应,解析内容形成字典,发现新的URL爬取请求
# -*- coding: utf-8 -*-
import scrapy
# 名字取名为demo所有类名为DemoSpider
class DemoSpider(scrapy.Spider):
name = 'demo'
# 用户提交给命令行的域名,说明只能爬取这个域名一下的相关连接
allowed_domains = ['python123.io']
# 以列表形式包含一个或多个url
start_urls = ['http://python123.io/']
# 解析页面空的方法
def parse(self, response):
pass
- 配置产生的spider爬虫
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
# allowed_domains = ['python123.io']【不需要,将这个变成注释】
start_urls = ['https://python123.io/ws/demo.html']
def parse(self, response):
# 定义存储response文件的名字
# 从响应的url文件名作为文件的名字
fname = response.url.split('/')[-1]
# 将返回的内容保存为文件
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file &s.' & name)
- 运行爬虫,获得网页
scrapy crawl demo
demo.py代码完整版
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
def start_requests(self):
urls = ['https://python123.io/ws/demo.html']
for url in urls:
# 向NGINE提出访问请求
yield acrapy.Request(url = url, callback = self.parse)
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file &s.' & name)
2.2 yield
关键字
yield
是一个生成器
- 生成器是一个不断产生值得函数
- 包含
yield
语句的函数是一个生成器 - 生成器每次产生一个值,函数被冻结,被唤醒后再产生一个值
'''生成器写法'''
def gen(n):
for i in range(n):
yield i**2
以上函数能够产生所有小于n的整数的平方值
当函数被调用时,首先执行for
循环,到yield
时,函数会被冻结,而当前yield
那一行的值会被返回出来
生成器的使用一般与for
循环搭配,调用生成器
for i in gen(5):
print(i, ' ', end = ' ') # 0 1 4 9 16
普通写法
def square(n):
ls = [i**2 for i in range(n)]
return ls
a = square(5)
a # [0, 1, 4, 9, 16]
生成器,相比一次列出所有内容的普通写法,更节省存储空间、更快的响应速度、使用更灵活
demo.py的完整的代码中的下列代码就是生成器的利用
for url in urls:
# 使用yield语句,每次只提交一个请求
yield acrapy.Request(url = url, callback = self.parse)
2.3 基本使用
Scrapy爬虫基本步骤
- 创建一个工程和Spider模板
- 编写Spider
- 编写Item Pipeline
- 优化配置策略
Scrapy爬虫数据类型
- Request类:向网络提交请求的内容,表示一个HTTP请求,由Spider生成,Downloader执行
属性和方法 | 说明 |
---|---|
.url |
Request对应的请求URL地址 |
.method |
对应的请求方法,GET 、POST 等 |
.headers |
字典类型风格的请求头 |
.body |
请求内容主题,字符串类型 |
.meta |
用户添加的扩展信息,在Scrapy内部模块间传递信息使用 |
.copy() |
复制该请求 |
- Response类:从网络上爬取内容的封装类,表示一个HTTP响应,由Downloader生产,Spider处理
属性和方法 | 说明 |
---|---|
.url |
Response对应的URL地址 |
.status |
HTTP状态码,默认是200 |
.headers |
Response对应的头部信息 |
.body |
Response对应的内容信息,字符串类型 |
.flags |
一组标记 |
.request |
产生Response类型对应的Request对象 |
.copy() |
复制该响应 |
- Item类:由Spider产生的信息封装的类,表示一个从HTML页面中提取的信息内容,由Spider生成,Item Pipeline处理。是一个类字典类型,可以按照字典类型操作
Scrapy爬虫提取信息的方法
- Beautiful Soup
- lxml
- re
- XPath Selector
- CSS Selector:<HTML>.css('a::attr(href)').extract()
CSS中,a:标签名称;href:标签属性
目录
Python网络爬虫与信息提取
一、Requests库
二、Beautiful Soup库
三、Re库
四、Scrapy框架
汇总