Scrapy介绍和使用
scrapy是一个快速功能强大的网络爬虫框架。
安装使用:pip install scrapy
、执行:scrapy -h
Scrapy不是一个函数功能库,而是一个爬虫框架,是实现爬虫功能的一个软件结构和功能集合,爬虫框架是半成品,能够帮助用户实现专业的网络爬虫。
Scrapy爬虫框架结构
分布式,5+2结构
框架结构解析
流程,数据流
数据流的三个路径
1.Engine从Spider处获得爬取请求(Request)
2.Engine将爬取请求转发给Scheduler,用于调度
3.Engine从Scheduler处获得下一个要爬取的请求
4.Engine将爬取请求通过中间件发送给Downloader
5.爬取网页后,Downloader形成响应(Response)通过中间件发给Engine
6.Engine将收到的响应通过中间件发送给Spider处理
7.Spider处理响应后产生爬取项(scraped Item)和新的爬取请求(Requests)给Engine
8.Engine将爬取项发送给Item Pipeline(框架出口)
9.Engine将爬取请求发送给Scheduler
数据流出口
Engine控制各模块数据流,不间断从Scheduler处获得爬取请求,直至请求为空
框架入口:Spider的初始爬取请求
框架出口:Item Pipeline
- Engine:控制所有模块之间的数据流,根据条件触发事件,不需用户修改。
- Dowloader:根据请求下载网页,不需用户修改。
- Scheduler:对所有爬取请求进行调度管理,不需用户修改。
- Downloader Middleware:实施施Engine、Scheduler和Downloader
之间进行用户可配置的控制。修改、丢弃、新增请求或响应,用户可编写配置代码。 - Spider:解析Downloader返回的响应(Response),产生爬取项(scraped item),产生额外的爬取请求(Request),需用户编写配置代码。
- Item Pipelines:以流水线方式处理Spider产生的爬取项,由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型,可能操作包括:清理、检验和查重爬取项中的HTML数据、将数据存储到数据库,需要用户配置。
- Spider Middleware:对请求和爬取项的再处理,修改、丢弃、新增请求或爬取项,用户可以编写配置代码。
Scrapy常用命令
在终端命令(黑色窗口)中运行 cmd----scrapy -h
Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行,命令行适合脚本控制,scrapy给开发人员使用,功能更为重要。
命令——>说明——>格式
startproject 创建一个新工程 scrapy startproject <name> [dir]
genspider 创建一个爬虫 scrapy genspider [options] <name> <domain>
setting 获得爬虫配置信息 scrapy setting [options]
crawl 运行一个爬虫 scrapy crawl <spider>
list 列出工程中所有的爬虫 scrapy list
shell 启动URL调试命令行 scrapy shell [url]
如何选择使用
requests与Scrapy对比:
两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
两者可用性都好,文档丰富,入门简单
两者都没有处理js、提交表单、应对验证码等功能(可扩展)
Scrapy是网站级爬虫,并发性好,性能较高,重点在于爬虫结构,一般定制灵活,深度定制困难,入门稍难
小需求使用requess库完成,不太小的需求,Scrapy框架,定制程度很高的需求,不考虑规模,需自搭框架。
Scrapy基本使用和工作流程
应用Scrapy爬虫框架主要是编写配置型代码
步骤1:建立一个Scrapy爬虫工程
命令为:scrapy startproject 创建的文件名
生成的工程目录:
分别对应的:
外层目录
部署Scrapy爬虫的配置文件
Scrapy框架的用户自定义Python代码
初始化脚本
Items代码模板(继承类)
Middlewares代码模板(继承类)
Pipelines代码模板(继承类)
Scrapy爬虫的配置文件
Spiders代码模板目录(继承类)
缓存目录,无需修改
步骤2:在工程中产生一个Scrapy爬虫
生成一个名称为demo的spider,在spiders目录下增加代码文件demo.py
生成的demo文件内容
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
allowed_domains = ['lizhe.net']
start_urls = ['http://lizhe.net/']
def parse(self, response):
#parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求
pass
步骤3:配置产生的spider爬虫
配置:(1)初始URL地址 (2)获取页面后的解析方式
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
#allowed_domains = ['lizhe.blog.csdn']
def start_requests(self):
urls = ['https://lizhe.blog.csdn.net/']
for url in urls:
yield scrapy.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." % fname)
步骤4:运行爬虫,获取网页
cmd中命令:scrapy crawl demo
demo爬虫被执行,捕获页面存储在demo.html
yield关键字的使用
包含yield语句的函数是一个生成器,生成器每次产成一个值,函数被冻结,被唤醒后再产生一个值,生成器是一个不断产生值的函数。
def gen(n):
for i in range(n):
yield i**3
for i in gen(5):
print(i, " ", end="")
生成器每调用一次在yield位置产生一个值,直到函数执行结束。
生成器优势特点:更节省存储空间,响应更迅速,使用更灵活。
Scrapy爬虫的使用步骤
步骤1:创建一个工程和Spider模板
步骤2:编写Spider
步骤3:编写Item Pipeline
步骤4:优化配置策略
Scrapy爬虫的数据类型
Request类、Response类、Item类
Request:
scrapy.http.Request()
Request对象表示一个HTTP请,由Spider生成,由Downloader执行
Request属性或方法
.url Request对应的请求URL地址
.method 对应的请求方法,"GET" "post"等
.headers 字典类型风格的请求头
.body 请求内容主体,字符串类型
.meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用
.copy() 复制该请求
Response:
scrapy.http.Response()
Response对象表示一个HTTP响应,由Downloader生成,由Spider处理
Response属性或方法
.url Response对应的URL地址
.status HTTP状态码,默认是200
.headers Response对应的头部信息
.body Response对应的内容信息,字符串类型
.flags 一组标记
.request 产生Response类型对应的Request对象
.copy() 复制该响应
Item:
scrapy.item.Item()
Item对象表示一个从HTML页面中提取的信息内容,由Spider生成,由Item Pipeline处理,Item类似字典类型,可以按照字典类型操作。
Scrapy爬虫支持多种HTML信息提取方法
- Beautiful Soup
- lxml
- re
- XPath Selector
- CSS Selector
配置并实现Scrapy爬虫的步骤过程:
1.建立工程和Spider模板
2.编写Spider
3.编写Pipeline
4.再进行配置优化