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混淆
  • 代理

python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制的更多相关文章

  1. python爬取实习僧招聘信息字体反爬

    参考博客:http://www.cnblogs.com/eastonliu/p/9925652.html 实习僧招聘的网站采用了字体反爬,在页面上显示正常,查看源码关键信息乱码,如下图所示: 查看网页 ...

  2. Python爬虫工程师必学——App数据抓取实战 ✌✌

    Python爬虫工程师必学——App数据抓取实战 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统 ...

  3. Python爬虫工程师必学APP数据抓取实战✍✍✍

    Python爬虫工程师必学APP数据抓取实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  4. Python爬虫工程师必学——App数据抓取实战

    Python爬虫工程师必学 App数据抓取实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  5. Python爬虫入门教程 16-100 500px摄影师社区抓取摄影师数据

    写在前面 今天要抓取的网站为 https://500px.me/ ,这是一个摄影社区,在一个摄影社区里面本来应该爬取的是图片信息,可是我发现好像也没啥有意思的,忽然觉得爬取一下这个网站的摄影师更好玩一 ...

  6. crawlSpider全站爬取 分布式

    # 如何提升scrapy爬取数据的效率? 推荐: 单线程加异步协程 增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings.py中修改 CONCURRENT_REQU ...

  7. 爬虫 crawlSpider 分布式 增量式 提高效率

    crawlSpider 作用:为了方便提取页面整个链接url,不必使用创参寻找url,通过拉链提取器,将start_urls的全部符合规则的URL地址全部取出 使用:创建文件scrapy startp ...

  8. Python爬虫实例(二)使用selenium抓取斗鱼直播平台数据

    程序说明:抓取斗鱼直播平台的直播房间号及其观众人数,最后统计出某一时刻的总直播人数和总观众人数. 过程分析: 一.进入斗鱼首页http://www.douyu.com/directory/all 进入 ...

  9. python爬虫---实现项目(二) 分析Ajax请求抓取数据

    这次我们来继续深入爬虫数据,有些网页通过请求的html代码不能直接拿到数据,我们所需的数据是通过ajax渲染到页面上去的,这次我们来看看如何分析ajax 我们这次所使用的网络库还是上一节的Reques ...

随机推荐

  1. python关于type()与生成器generator的用法

    如果按这种形式写  type(a)(b) 那此处的b是个可迭代对象,这个对象迭代完成后,再放到type里    from pymysql._compat import range_type, text ...

  2. 201671030126 赵佳平 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于那个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 掌握软件项目评审会流程:反思 ...

  3. Electron实现第一个应用 "hello world"

    一. 什么是Electron? 它和NW.js的区别是什么? Electron是GitHub开发的桌面应用开发框架,它支持使用HTML.CSS.JavaScript来构建跨平台的桌面应用. Elect ...

  4. 【java异常】redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

    产生此错误的原因通常是: 一.Redis没有启动: 我自己遇到一次这样的问题.汗! 二.由于防火墙原因无法连接到Redis; 1.服务器防火墙入站规则. 2.访问Redis的应用程序所在主机的出站规则 ...

  5. java注释代码规范

    //收集了一小部分,忘记的时候过来查一下 java--hadoop部分 /** * 此类用来处理DNS原始日志:统计给定域名平均响应时延 * @param Input * @param Output ...

  6. Linux提高工作效率的命令

    find ./ -name 'laun*'|xargs grep 8881 在laun开头的文件内查找8881 find ./ -name 'laun*' find . -type f -mtime ...

  7. ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)

    IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...

  8. ros ap 的无线中继

    https://wiki.mikrotik.com/wiki/Manual:Interface/Wireless#Repeater Wireless repeater will allow to re ...

  9. Spring Boot 2.2.2 发布,新增 2 个新特性!

    Spring Boot 2.2.2 发布咯! Spring Boot 2.2.1 发布,一个有点坑的版本! 2.2.1 发布没过一个月,2.2.2 就来了. Maven依赖给大家奉上: <dep ...

  10. 分布式事务解决方案(一) 2阶段提交 & 3阶段提交 & TCC

    参考文档:http://blog.jobbole.com/95632/https://yq.aliyun.com/articles/582282?spm=a2c4e.11163080.searchbl ...