i、scrapy框架
scrapy框架
1、是什么?
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
官方网站
https://doc.scrapy.org/en/latest/
中文:http://www.scrapyd.cn/doc/
中文:http://scrapy-chs.readthedocs.io/zh_CN/latest/
2、提供两种爬虫方式
-
scrapy.Spider:普通的爬虫类
-
scrapy.CrawlSpider:规则的爬虫类
3、如何安装
pip install scrapy==1.5.1 -i http://mirrors.aliyun.com/pypi/simple
安装错误解决:
pip install pywin32
pip install Twsited-*.whl
4、框架组成
5个组成部分中,最重要的就是spider,代码大都是写在spiders中
-
引擎(engine):自动运行,无需关注,会自动组织所有的请求对象,分发给下载器
-
下载器(downloader):从引擎处获取到请求对象后,请求数据
-
爬虫spiders:Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。
-
scrapy.Spider 普通的爬虫
-
scrapy.CrawlSpider
- 可设置规则的爬虫类
- Rule 规则类
-
开始的函数
- start_requests()
-
-
调度器(scheduler):有自己的调度规则,无需关注
-
管道(Item pipeline):
最终处理数据的管道,会预留接口供我们处理数据
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
以下是item pipeline的一些典型应用:- 清理HTML数据
- 验证爬取的数据(检查item包含某些字段)
- 查重(并丢弃)
- 将爬取结果保存到数据库中
-
- 清理HTML数据
-
- 验证爬取的数据(检查item包含某些字段)
-
- 查重(并丢弃)
-
- 将爬取结果保存到数据库中
-
- 对图片数据进行下载
5、工作原理
-
示例图
- Scrapy数据流是由执行的核心引擎(engine)控制
-
流程
- 爬虫引擎获得初始请求开始抓取。
- 爬虫引擎开始请求调度程序,并准备对下一次的请求进行抓取。
- 爬虫调度器返回下一个请求给爬虫引擎。
- 引擎请求发送到下载器,通过下载中间件下载网络数据。
- 一旦下载器完成页面下载,将下载结果返回给爬虫引擎。
- 引擎将下载器的响应通过中间件返回给爬虫进行处理。
- 爬虫处理响应,并通过中间件返回处理后的items,以及新的请求给引擎。
- 引擎发送处理后的items到项目管道,然后把处理结果返回给调度器,调度器计划处理下一个请求抓取。
- 重复该过程(继续步骤1),直到爬取完所有的url请求
6、如何使用
6.1、创建项目
scrapy startproject 项目名称
6.2、目录结构
-
spiders
-
init.py
-
自定义的爬虫文件.py
由我们自己创建,是实现爬虫核心功能的文件
注意,创建文件的路径不要搞错,应当在spiders文件夹内创建自定义的爬虫文件
-
-
init.py
-
items.py
定义数据结构的地方,是一个继承自scrapy.Item类, 属性字段的类型是 scrapy.Field()
注意: scrapy.Item类,实际是一个dict字典, 所以在spider的parse()函数返回的迭代元素应该是dict字典对象,且字典的key与item的Field()相对应
-
middlewares.py
中间件, 用于调整业务逻辑
-
pipelines.py
管道文件
里面只有一个类,用于处理下载数据的后续处理
-
settings.py
配置文件
比如:
是否遵守robots协议
User-Agent定义等
6.3、创建自定义爬虫文件
-
scrapy genspider 爬虫名字 网页的域名
scrapy genspider qiubai "www.qiushibaike.com"
注意:终端先跳转到spiders文件夹的路径,再进行创建
即cd qiubai/qiubai
-
继承scrapy.Spider类
新创建的爬虫文件继承自scrapy.Spider类
-
name = 'qiubai' #运行爬虫文件时使用的名字
-
allowed_domains #爬虫允许的域名,在爬取的时候,如果不是此域名之下的url,会被过滤掉
-
start_urls #声明了爬虫的起始地址,可以写多个url,一般是一个
-
-
parse(self, response)
解析数据的回调函数
response保存了下载的数据,可以在此函数内对其进行解析,通常使用xpath
parse()函数,如果有返回值,必须返回可迭代的对象
-
response 是 scrapy.http.HtmlResponse类对象
-
response的属性
-
response.encoding:字符集,不能直接修改
-
response.text:文本信息
-
response.body:字节数据
-
response.headers:头
-
response.meta:元信息,用于从请求向响应的解析函数中传递参数
-
response.request:响应的哪一个请求对象
-
response.url
-
-
response.xpath()/css()
-
scrapy.selector.Selector
-
返回Selector对象
-
内部写法:self.selector.xpath()
-
css()用法
-
同css的样式选择器,如id,class或标签等
-
访问标签内的属性
-
'#page a::attr("href")':获取id为page的a标签的href属性
-
'.list-img a::text':获取class为list-img下的a标签的text文本内容
-
-
-
xpath()用法:同lxml的xpath用法,主要是针对的路径
-
提取数据
-
extract()
-
Selector对象的方法,用于获取Selector对象的内容
-
response.xpath('//title/text()').extract() :返回list
-
response.css('').xpath():先使用css选择标签元素,再通过xpath提取内容
-
-
extract_first()
- 提取第一条内容
-
get()
- 同 extract_first()方法
-
-
-
-
-
解析数据回传给engine
yield item
-
向engine发起新的请求
yield scrapy.Request(url, callback=,meta=, dont_filter=True)
-
运行程序
#运行爬虫程序 scrapy crawl 爬虫名称
注意:应在spiders文件夹内执行
-
导出文件
- -o name.json
- -o name.xml
- -o name.csv
eg:
scrapy crawl dy -o vides.json
-
扩展
爬虫停止条件
-
Scrapy的CloseSpider扩展会在满足条件时自动终止爬虫程序。
-
可用选项
- CLOSESPIDER_TIMEOUT(秒)指定时间过后
- CLOSESPIDER_ITEMCOUNT 抓取了指定数目的Item之后
- CLOSESPIDER_PAGECOUNT 收到了指定数目的响应之后
- CLOSESPIDER_ERRORCOUNT 发生了指定数目的错误之后
如:
$ scrapy crawl fast -s CLOSESPIDER_ITEMCOUNT=10
$ scrapy crawl fast -s CLOSESPIDER_PAGECOUNT=10
$ scrapy crawl fast -s CLOSESPIDER_TIMEOUT=10