zoukankan      html  css  js  c++  java
  • 爬虫第三天

    - 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这个数据结构中
                 
  • 相关阅读:
    分布式爬虫
    前端页面展示
    fillter根据value来匹配字段
    element ui 怎么去修改el-date-picker的时间
    element ui,input框输入时enter健进行搜索
    element ui 里面的table怎么弹出一个框让表中数据点击出现弹框
    修改数据结构记录,将同级数据改成父子集数据
    h5的复制功能的使用,Clipboard.js的使用,主要是在app里面使用
    在安卓手机下按钮会悬浮在键盘上,怎么解决vue.js
    last-child为啥不生效
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/11779924.html
Copyright © 2011-2022 走看看