scrapy 框架操作\持久化存储\CrawlSpider的全站\分布式爬虫

scrapy框架操作

  • 创建工程
scrapy startproject ProName
  • 创建一个爬虫文件(spiders)
cd ProName
scrapy genspider spiderName www.xxx.com
      分析爬虫文件:
  • 执行工程
scrapy crawl spiderName

scrapy的持久化存储操作
基于终端指令-只能是本地文件,json,csv…

特性:只可以将parse方法的返回值进行数据的本地存储
执行:scrapy crawl qiubai  o xxx.csv

基于管道-数据库
编码流程:

1.数据解析
2.构造Item类
3.将解析的数据封装到Item类型的对象中
4.将item对象提交给管道
5.在管道中执行任意形式的持久化存储操作
6.开启管道

细节:

在管道文件中一个管道类对应的是一种持久化存储的方式
process_item中的返回值表示的含义是说将item传递给下一个即将被执行的管道类
保证process_item中有返回值的
  • 全站数据爬取
    指定一个通用的url模板
    手动请求发送:yield scrapy.Request(url,callback)
    callback表示指定回调函数用作于数据解析

  • 下载中间件
    作用:拦截请求和响应
    拦截请求干什么?
    - UA伪装
    process_request:
    request.headers[‘User Agent’] = ‘xxxx’
    - 代理ip
    process_request:
    request.meta[‘proxy’] = ‘https://ip:port’

        注意:手动在settings配置文件中开启中间件
    
  • 请求传参
    是被应用在深度爬取中!
    使用场景:
    使用scrapy爬取的数据没有在同一张页面中
    将item传递给另一个解析函数
    传递item:yield scrapy.Request(url,callback,meta={‘item’:item})
    接收item:item = response.meta[‘item’]

基于CrawlSpider的全站数据爬取
编码流程:

创建爬虫文件:scrapy genspider  t crawl spiderName www.xxx.com

分布式爬虫
目的:提升爬取数据的效率
概念:搭建一个分布式机群(由多台电脑组成),让分布式机群同时执行同一组爬虫程序,实现数据的分布爬取

scrapy的五大核心组件
scrapy框架的工作流程都是基于该五大组件完成

五大组件的作用

  • Spider:用于产生url,并且进行数据解析.
  • 调度器:对请求对象进行过滤,然后将请求对象存储到队列中,然后从队列中调度请求对象进行数据下载
  • 管道:持久化存储
  • 下载器:接收请求对象进行数据下载
  • 引擎:接收处理数据流,触发事务

原生的scrapy是不可以实现分布式

  • 调度器无法被分布式机群共享
  • 管道不可以被分布式机群共享

scrapy需要结合scrapy redis实现分布式

scrapy redis的作用:可以给scrapy提供可以被共享的管道和调度器
scrapy redis就是一个模块:

pip install scrapy redis

实现步骤:
创建的工程
创建一个基于CrawlSpider的爬虫文件
修改爬虫文件:
导包:from scrapy_redis.spiders import RedisCrawlSpider
修改爬虫类的父类:将RedisCrawlSpider作为当前爬虫类的父类
将start_urls和allow_demains注释掉
添加一个新属性:redis_key = ’xxx‘
在setting配置文件中进行配置

  • 指定管道:
    ITEM_PIPELINES = {
    ‘scrapy_redis.pipelines.RedisPipeline’: 400
    }

指定调度器:
# 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
# 使用scrapy redis组件自己的调度器
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True
指定具体的redis数据库
REDIS_HOST = ‘redis服务的ip地址’
REDIS_PORT = 6379

配置redis的配置文件redis.windows.conf:
line56: #bind 127.0.0.1
关闭保护模式:line75:protected mode no
开启redis服务
携带配置文件开启:redis server redis.windows.conf
redis cli
执行工程:
scrapy runspider xxx.py
向调度器队列中仍如一个起始的url:

你可能感兴趣的:(爬虫)