八、scrapy框架
8.1、简介
8.1.1、概念
就是一个集成了很多功能并且具有很强通用性的一个项目模板。
8.1.2、功能
高性能的持久化存储
异步的数据下载
高性能的数据解析
分布式的封装
8.2、环境安装
pip install scrapy
Mac or linux:
pip install scrapy
windows :
pip install wheel
下载twisted,下载地址为 http://www.lfd.uci.edu/~gohlke/ pythonlibs/#twisted
安装twisted:pip install Twisted-17.1.0-cp36-cp36m-win_amd64. whl
pip install pywin32
pip install scrapy
测试:在终端里录入scrapy指令,没有报错即表示安装成功!
8.3、使用步骤
创建一个工程:
scrapy startproject xxxPro
在spiders子目录中创建一个爬虫文件
scrapy genspider spiderName www.xxx.com
8.4、框架的一些基本设置详解
8.5、数据解析
● xpath返回的是列表但是列表元素一定是Selector类型的对象
● extract可以将Selector对象中data参数存储的字符串提取出来
● 列表调用了extract之后。则表示将列表中每个Selector对象中data对应的字符串提取了出来
8.6、持久化存储
8.6.1、基于终端指令:
要求:只可以将parse方法的返回值存堵到本地的文本文件中
注意:持久化存储对应的文本文件的类型只可以为:(‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’, ‘marshal’, ‘pickle’)类型
指令: scrapy crawl 爬虫文件名 -o ./文件名.csv
好处:简介高效便捷
缺点:局限性比较强(数据只可以存储到指定后缀的文本文件中)
8.6.2、基于管道
编码流程:
① 数据解析
② 在item类中定义相关的属性
③ 将解析的数据封装存储到item类型的对象
④ 将item类型的对象提交给管道进行持久化存储的操作
⑤ 在管道类的process_item中要将其接受到的item对象中存储的数 据进行持久化存储操作,该方法可以接收爬虫文件提交过来的item 对象,每接收一个item就会被调用一次
⑥ 配置文件中开启管道
# 300表示的是优先级,数值越小优先级越
代码演示:
8.6.3、基于管道(不同方式同时存储)
注意:
① 爬虫文件提交的item只会给管道文件中第个被执行的管道类接受
② process_item中的return item表示将item传递给下一个即将被执行的管道类。
③ 管道文件中一个管道类对应的是将数据存储到一种平台
pipelines.py演示:
settings.py演示:
8.7、基于Spiper的全站数据爬取
就是将网站中某板块下的全部页码对应的页面数据进行爬取
需求:
爬取校花网中的照片的名称
实现方式:
① 将所有页面的url添加到start_urls列表(不推荐)
② 自行手动进行请求发送(推荐)
yield scrapy.Request(url,callback):callback专门用做于数据解析
8.8、五大核心组件
● 引擎(Scrapy)
用来处理整个系统的数据流处理触发事务(框架核心)。
● 调度器(Scheduler
用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返 回,可以想像成一个URL (抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么同时去除重复的网址。
● 下载器(Downloader)
用于下载网页内容,井将网页内容返回给蜘蛛(Scrapy下载器是建立在 twisted这个高效的异步模型上的)。
● 爬虫(Spiders)
爬虫是主要干活的,用于从特定的网页中提取自己需要的信息,即所 谓的实体([tem).用户也可以从中提取出链接让Scrapy继续抓取下一个 页面。
● 项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证 实体的有效性。清除不需要的信息。当页面被爬虫解析后,将被发送 到项目管道,并经过几个特定的次序处理数据。
8.9、请求传参
使用场景:
如果爬取解析的数据不在同一张页面中。(深度爬取)
请求传参:
meta={}可以将meta字典传递给请求对应的回调函数
8.10、图片数据爬取ImagesPipeline
基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别
● 字符串:只需要基于xpath进行解析且提交管道进行持久化存储
● 图片: xpath解出图片src的属性值。单独的对图片地址发起请求获取 图片二进制类型的数据
8.10.1、ImagesPipeline :
只需要将img的src的属性值进行解析,提交到管道,管道就会对图片的src进行请求发送获取图片的二进制类型的数据,且还会帮我们进行持久化存储
8.10.2、使用流程
分析:
● 数据解析(图片的地址)
● 将存储图片地址的item提交到制定的管道类
● 在管道文件中自定制一个基于ImagesPipeLine的一个管道类
▶ get_ media_ request
▶ file_ path
▶ item completed
● 在配置文件中:
▶ 指定图片存储的目录:IMAGES_STORE =’./imgs’
▶ 指定开启的管道:自定制的管道类。
管道类编写:
配置文件添加:
IMAGES_STORE = ‘/imgs’,表示最终图片存储的目录
爬虫类:
8.11、中间件的使用
8.11.1、下载中间件
● 位置:
引擎和下载器之间
● 作用:
批量拦截到整个工程中发起的所有的请求和响应
● 拦截请求(作用):
▶ UA伪装 :写到process_ request
▶ 代理IP :写到 process_ exception: return request
● 拦截响应(作用):
▶ 篡改响应数据,响应对象
8.11.2、UA池
user_agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
"(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
8.11.3、拦截请求案例
middlewares.py的编写:
test.py的编写:
8.11.4、拦截响应案例
xinWen.py编写:
items.py编写:
pipelines.py编写:
middlewares.py编写:
8.12、CrawlSpider
8.12.1、简介
CrawlSpider类,是Spider的一个子类
8.12.2、全站数据爬取的方式
● 基于Spider:手动请求
● 基于CrawlSpider
8.12.3、组件介绍
链接提取器:
根据指定规则(allow="正则)进行指定链接的提取
规则解析器:
将链接提取器提取到的链接进行指定规则(callback)的解析操作
Followe:
Followe=Trues可以将链接提取器 继续作用到 链接提取器提取到的链接 所对应的页面中
8.12.4、使用步骤
创建一个工程
cd xxx
创建爬虫文件(CrawlSpider)
scrapy genspider -t crawl xxx www.xxx.com
8.12.5、案例1
pipelines.py:
items.py:
test.py:
8.12.5、案例2
pipelines.py:
items.py:
test.py:
8.12、分布式爬虫
8.12.1、概念
我们需要搭建一个分布式的机群,让其对一组 资源进行分布联合爬取。
8.12.2、作用
提升爬取数据的效率
8.12.3、环境搭建
安装一个scrapy-redis的组件
8.12.4、补充
为什么原生的scrapy不可以实现分布式?
● 调度器不可以被分布式机群共享。
● 管道不可以被分布式机群共享。
scrapy-redis组件作用: