爬虫第三天

- 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这个数据结构中
             
原文地址:https://www.cnblogs.com/lilyxiaoyy/p/11779924.html