• Ssrapy框架


    Scrapy框架的使用

    1. - pySpider
    2. - 什么是框架?
    3. - 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中)
    4. - scrapy集成好的功能:
    5. - 高性能的数据解析操作(xpath)
    6. - 高性能的数据下载
    7. - 高性能的持久化存储
    8. - 中间件
    9. - 全栈数据爬取操作
    10. - 分布式:redis
    11. - 请求传参的机制(深度爬取)
    12. - scrapy中合理的应用selenium

    - 环境的安装

    a. pip3 install wheel

    b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

    c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

    d. pip3 install pywin32

    e. pip3 install scrapy

    - 创建工程

    - scrapy startproject ProName
    - cd ProName
    - scrapy genspider spiderName www.xxx.com :创建爬虫文件
    - 执行:scrapy crawl spiderName
    - settings:
    - 不遵从robots协议
    - UA伪装
    - LOG_LEVEL = 'ERROR'

    - scrapy的数据解析
    - extract():列表是有多个列表元素
    - extract_first():列表元素只有单个
    - scrapy的持久化存储
    - 基于终端指令:
    - 只可以将parse方法的返回值存储到磁盘文件中
    - scrapy crawl first -o file.csv
    - 基于管道:pipelines.py

    - 编码流程:

    - 1.数据解析
    - 2.在item的类中定义相关的属性
    - 3.将解析的数据存储封装到item类型的对象中.item['p']
    - 4.将item对象提交给管道
    - 5.在管道类中的process_item方法负责接收item对象,然后对item进行任意形式的持久化存储
    - 6.在配置文件中开启管道
    - 细节补充:
    - 管道文件中的一个管道类表示将数据存储到某一种形式的平台中。
    - 如果管道文件中定义了多个管道类,爬虫类提交的item会给到优先级最高的管道类。
    - process_item方法的实现中的return item的操作表示将item传递给下一个即将被执行的管道类

    - 管道的持久化存储:

    - 数据解析(爬虫类)
    - 将解析的数据封装到item类型的对象中(爬虫类)
    - 将item提交给管道:yield item(爬虫类)
    - 在官大类的process_item中接收item对象并且进行任意形式的持久化存储操作(管道类)
    - 在配置文件中开启管道
    - 细节:
    - 将爬取的数据进行备份?
    - 一个管道类对应一种平台的持久化存储
    - 有多个管道类是否意味着多个管道类都可以接受到爬虫文件提交的item?
    - 只有优先级最高的管道才可以接受到item,剩下的管道类是需要从优先级最高的管道类中接收item

    - 基于Spider父类进行全站数据的爬取
    - 全站数据的爬取:将所有页码对应的页面数据进行爬取
    - 手动请求的发送(get):
    yield scrapy.Request(url,callback)
    - 对yield的总结:
    - 向管道提交item的时候:yield item
    - 手动请求发送:yield scrapy.Request(url,callback)
    - 手动发起post请求:
    yield scrapy.FormRequest(url,formdata,callback):formdata是一个字典表示的是请求参数

    - scrapy五大核心组件

    1.引擎(Scrapy)
                 用来处理整个系统的数据流处理, 触发事务(框架核心)


    2.调度器(Scheduler)
                用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

     

    3.下载器(Downloader)
                用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)


    4.爬虫(Spiders)
                爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面


    5.项目管道(Pipeline)
                负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

    - scrapy的请求传参
    - 作用:实现深度爬取。
    - 使用场景:如果使用scrapy爬取的数据没有存在同一张页面中
    - 传递item:yield scrapy.Request(url,callback,meta)
    - 接收item:response.meta

    - 提升scrapy爬取数据的效率
    - 在配置文件中进行相关的配置即可:


    增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。

    降低日志级别:在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘INFO’

    禁止cookie:如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False

    禁止重试:对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False

    减少下载超时:如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s


    - scrapy的中间件

    - 爬虫中间件
    - 下载中间件(***):处于引擎和下载器之间
    - 作用:批量拦截所有的请求和响应
    - 为什么拦截请求
    - 篡改请求的头信息(UA伪装)
    - 修改请求对应的ip(代理)
    - 为什么拦截响应
    - 篡改响应数据,篡改响应对象
    - 爬取网易新闻的新闻标题和内容

    - selenium在scrapy中的使用流程

    - 在爬虫类中定义一个bro的属性,就是实例化的浏览器对象
    - 在爬虫类重写父类的一个closed(self,spider),在方法中关闭bro
    - 在中间件中进行浏览器自动化的操作

     --------------------------------------------------------------------------------------------------------------------------

     --------------------------------------------------------------------------------------------------------------------------

    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

    - 图片懒加载
    - 应用到标签的伪属性,数据捕获的时候一定是基于伪属性进行!!!
    - ImagePileline:专门用作于二进制数据下载和持久化存储的管道类

    - CrawlSpider
    - 一种基于scrapy进行全站数据爬取的一种新的技术手段。
    - CrawlSpider就是Spider的一个子类
    - 连接提取器:LinkExtractor
    - 规则解析器:Rule
    - 使用流程:
    - 新建一个工程
    - cd 工程中
    - 新建一个爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com

    - 分布式
    - 概念:需要搭建一个分布式的机群,然后在机群的每一台电脑中执行同一组程序,让其对某一个网站的数据进行联合分布爬取。
    - 原生的scrapy框架是不可以实现分布式?
    - 因为调度器不可以被共享
    - 管道不可以被共享
    - 如何实现分布式?
    - scrapy+scrapy_redis实现分布式
    - scrapy-redis组件的作用是什么?
    - 可以提供可被共享的调度器和管道
    - 特性:数据只可以存储到redis数据库。
    - 分布式的实现流程:
    - 1.pip install scrapy-redis
    - 2.创建工程
    - 3. cd 工程目录中
    - 4.创建爬虫文件(a.创建基于Spider的爬虫文件 b.创建CrawlSpider的爬虫文件)
    - 5.修改爬虫类:
    - 导报:from scrapy_redis.spiders import RedisCrawlSpider
    - 修改当前爬虫类的父类为RedisCrawlSpider
    - allowed_domains和start_urls删除
    - 添加一个新属性:redis_key = 'fbsQueue',表示的是可以被共享的调度器队列的名称
    - 编写爬虫类的其他操作(常规操作)
    - 6.settings配置文件的配置
    - UA伪装
    - Robots
    - 管道的指定:
    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:
    - 关闭默认绑定:56Line:#bind 127.0.0.1
    - 关闭保护模式:75Line:protected-mode no
    - 启动redis的服务端和客户端:
    - redis-server.exe redis.windows.conf
    - redis-cli

    - 启动程序:
    scrapy runspider xxx.py
    - 向调度器的队列中仍入一个起始的url:
    - 队列是存在于redis中
    - 开启redis的客户端: lpush fbsQueue http://wz.sun0769.com/index.php/question/questionType?type=4&page=

    - 增量式
    - 概念:用于监测网站数据更新的情况。
    - 核心机制:去重。redis的set实现去重


    - 总结反爬机制:
    - robots
    - UA伪装
    - 验证码
    - 代理
    - cookie
    - 动态变化的请求参数
    - js加密
    - js混淆
    - 图片懒加载
    - 动态数据的捕获
    - seleium:规避检测

  • 相关阅读:
    《大道至简》读后感
    四大扩展欧几里得算法
    java8中使用函数式接口
    04_web基础(一)之tomcat介绍
    03_java基础(九)之综合练习与考核评估
    建站流程
    03_java基础(八)之static关键字与代码块
    (十)拒绝服务攻击工具包
    (九)拒绝服务攻击工具
    (八)拒绝服务–应用层DoS 攻击
  • 原文地址:https://www.cnblogs.com/xied/p/12558216.html
Copyright © 2020-2023  润新知