zoukankan      html  css  js  c++  java
  • python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制

    CrawlSpider实现的全站数据的爬取

    • 新建一个工程
    • cd 工程
    • 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com
    • 连接提取器LinkExtractor
      • 可以根据指定的规则对指定的连接进行提取
        • 提取的规则就是构造方法中的allow(‘正则表达式’)参数决定
    • 规则解析器Rule
      • 可以将将连接提取器提取到的连接进行请求发送,可以根据指定的规则(callback)对请求到的数据进行解析
    • follow=True:将连接提取器 继续作用到 连接提取器提取到的连接 所对应的 页面源码中

    分布式

    • 实现方式:scrapy+scrapy_redis组件实现的分布式。scrapy+redis

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

    • 什么是分布式

      • 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一个网络资源
        进行联合且分布的数据爬取。
    • 为什么scrapy不可以实现分布式

      • 调度器不可以被共享
      • 管道不可以被共享
    • scrapy-reids组件的作用是什么

    • 提供可以被共享的管道和调度器

    • 分布式的实现流程

      • 环境的安装:pip install scrapy-redis

      • 创建工程

      • cd 工程

      • 创建爬虫文件:

        • 基于Spider
        • 基于CrawlSpider
      • 修改爬虫文件:

        • 导报:
          from scrapy_redis.spiders import RedisCrawlSpider#基于crawlSpider爬虫文件
          from scrapy_redis.spiders import RedisSpider #基于Spider爬虫文件
        • 将当前爬虫类的父类修改为RedisCrawlSpider
        • 删除allowed_domains和start_urls
        • 添加一个redis_key = ‘xxx’属性,表示的是调度器队列的名称、
        • 根据常规形式编写爬虫文件后续的代码
      • 修改settings配置文件

        • 指定管道
          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 = '192.168.13.254'
          REDIS_PORT = 6379

      • 修改redis的配置文件redis.windows.conf

        • 关闭默认绑定
          • 56行:#bind 127.0.0.1
        • 关闭保护模式
          • 75行:protected-mode no
      • 启动redis的服务端(携带配置文件)和客户端

      • 启动分布式的程序:

        • scrapy runspider xxx.py
      • 向调度器的队列中扔入一个起始的url

        • 队列是存在于redis中
        • redis的客户端中:lpush sun www.xxx.com
      • 在redis中就可以查看爬取到的数据

    增量式

    • 概念:监测
    • 核心技术:去重
    • 适合使用增量式的网站:
      • 基于深度爬取
        • 对爬取过的页面的url进行一个记录(记录表)
      • 基于非深度爬取
        • 记录表:爬取过的数据对应的数据指纹
          • 数据指纹:就是原始数据的一组唯一标识
    • 所谓的记录表是以怎样的形式存在于哪?
      • redis的set充当记录表

    反爬机制

    • robots
    • UA伪装
    • 图片懒加载
    • 验证码
    • cookie
    • 动态加载的数据
    • 动态变化的请求参数
    • js加密
    • js混淆
    • 代理
  • 相关阅读:
    Wappalyzer(chrome网站分析插件)
    轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null
    一则sql优化实现接口耗时降低30倍的优化案例
    测试环境部署之填坑记录-Expected one result (or null) to be returned by selectOne(), but found: 2
    性能优化案例(2019-案例78)-接口性能耗时问题分析
    Unitest自动化测试基于HTMLTestRunner报告案例
    scrapy实例:爬取天气、气温等
    Python3爬取豆瓣网电影信息
    Locust压测结果准确性验证
    jd-gui反编译报错// INTERNAL ERROR //
  • 原文地址:https://www.cnblogs.com/dengz/p/11681829.html
Copyright © 2011-2022 走看看