- scrapy爬虫框架(异步框架)
- 1.数据解析
- 2.持久化存储
- 3.手动请求发送
- 4.全站数据的爬取
- 5.五大核心组件
- 6.请求传参:深度爬取
- 7.中间件
- 8.CrawlSpider
- 9.分布式
- 基本使用
- 1.创建一个工程:scrapy startproject ProName
- 2.cd ProName
- 3.新建一个爬虫文件:scrapy genspider spiderName www.xxx.com
- 4. 执行工程:scrapy crawl spiderName
- 基本配置settings.py
```python
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'
```
- 持久化存储
- 基于管道的持久化存储
- 在爬虫文件中数据解析
- 在Item类中定义相关的属性
- 将解析到的数据封装存储到Item类型的对象中
- 将Item类型的对象提交给管道
- 在管道中进行任意形式的持久化存储
- 在配置文件中开启管道
- 数据的备份
- 一个管道类负责将数据写入一个平台
- 爬虫文件提交的item只会提交给优先级最高的管道类
- 如何使得所有的管道类都可以接收到item呢?
- 在process_item方法中,进行item的返回即可。
- 手动请求的发送
- yield scrapy.Request(url, callback) ==>get请求
- yield scrapy.FormRequest(url, formdata, callback) ==>post请求
- 五大核心组件
- 引擎(Scrapy)
- 用来处理整个系统的数据流处理,触发事务(框架核心)
- 调度器(Scheduler)
- 用来接收引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回,可以想象成一个URL(抓取网页的网址
或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同事去除重复的网址。
- 下载器(Downloader)
- 用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
- 爬虫(Spiders)
- 爬虫是主要干活的,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出
链接,让Scrapy吉祥抓取下下一个页面。
- 项目管道(Pipeline)
- 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。
当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
- 请求传参
- 作用:让scrapy实现深度爬取
- 什么是深度爬取?
- 爬取的数据没有存储在同一张页面中。
- 通过scrapy.Request(url, callback, meta)中的meta字典,将该字典传递给callback
- 在callback中通过response.meta来接收这个参数
- 中间件
- 种类
- 下载中间件
- 爬虫中间件
- 作用
- 批量拦截请求和响应
- 为什么需要拦截请求
- 设定代理
- process_exception()
- request.meta['proxy'] = 'https://ip:port'
- 篡改请求头信息(UA)
- process_request()
- request.headers['User-Agent'] = 'xxx'
- 可以使用UA池
- CrawlSpider
- 是Spider的一个子类,CrawlSpider的功能要多于Spider。
- 作用:用于实现全站数据爬取
- 使用:
- 创建工程 scrapy startproject ProjectName
- cd ProName
- scrapy genspider -t crawl spiderName www.xxx.com
- 链接提取器(LinkExtractor):
- 可以根据指定的规则进行指定链接的提取
- 规则解析器(Rule):
- 可以将LinkExtractor提取出连接进行请求发送,然后根据指定的规则进行数据的解析。
- 分布式
- 概念:组件一个分布式的机群,然后让其执行同一组程序,联合爬取同一个资源中的数据。
- 实现方式
- scrapy+redis(scrapy和scrapy_redis组件)
- 为什么原生的scrapy不可以实现分布式?
- 调度器不可以被共享
- 管道不可以被共享
- scrapy_redis组件作用
- 可以提供可以被共享的管道和调度器
- 环境安装
- pip install scrapy-redis
- 编码流程
- 修改爬虫文件
- 1.导包
- from scrapy_redis.spiders import RedisCrawlSpider
- 2.修改当前爬虫文件中的父类改为RedisCrawlSpider
- 3.删除start_urls属性
- 4.添加redis_key的属性,属性值为任意的字符串即可。表示是可以被共享的调度器队列的名称。
- 5.爬虫文件常规操作编写。
- 配置配置文件settings
- 指定管道
```python
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
}
```
- 指定调度器
```python
# 增加了一个去重容器类的配置,作用使用Redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化。
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化,也就是当爬虫结束了,要不要清空Redis中请求队列和去重指纹的set。如果是True,就表示要持久化存储,就不清空数据,否则清空数据
SCHEDULER_PERSIST = True
```
- 指定redis
```python
REDIS_HOST = '192.168.1.3'
REDIS_PORT = 6379
```
- 修改redis的配置文件redis.windows.conf
- 56行: #bind 127.0.0.1
- 75行: protected-mode no
- 结合者配置文件启动redis服务端
- redis-server.exe redis.windows.conf
- 启动客户端
- redis-cli.exe
- 执行工程
- cd spiders
- scrapy runspider xxx.py
- 将起始的url放入到可以被共享的调度器的队列中
- 队列是存在于redis数据库中
- redis-cli
- lpush redis_key的属性值 www.xxx.com
- 最终爬取的数据都存储在了redis的xxx:items这个数据结构中