2021-07-11

今年过去就在小组待了整整一年了,这一年了收获了很多,自己也拥有的更多的责任,自己成为了python负责人,其实自己并没有那么实力去担任这个职务,我自己也知道自己无论是在技术还有其他方面还有很多的里要走,希望自己能够在今后的日子里可以更加的努力,不断向着自己的目标前进

今年学的技术比较多也比较杂,学了Django、算法、数据结构、爬虫

算法

scrapy框架

  • 框架
    是一个集成很多功能并且具有很强通用性的一个项目模板

  • 如何学习框架

    • 专门学习封装各种功能的详细用法
  • 什么是scrapy框架

    • 爬虫中的一个明星框架,
      功能:高性能的的持久性的的储存,异步的数据下载,高性能的数据解析,分布式
  • scrapy框架基本使用

    • 环境的安装
      windows:
      pycharm 中直接就可以安装 pip install scrapy
      创建一个工程:
      scrapy startproject xxx
      cd xxx
      在spiders子目录创建一个爬虫文件

      • scrapy genspider spiderName www.xxxxx.com
        执行工程:
      • scrapy crawl spiderName
    • scrapy数据解析

    • scrapy持久化存储:

      • 基于终端指令:
        • 要求:只可以将parse方法的返回值存储到本地文件中
        • 注意:持久化存储对应的文本文件内类型只可以是(‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’
          , ‘marshal’, ‘pickle’)
        • 指令:scrapy crawl qiubaipro -o qiuba.csv
          scrapy crawl XXX(爬虫文件名) -o xxx. (存储的文件名,及文件格式)
        • 好处:简介高效,便捷
        • 缺点:局限性比较强(数据只可以储存到指定后缀的文件中)
      • 基于管道:
        • 编码流程:
          • 数据解析
          • 在item中定义相关属性
          • 将解析的数据封装储存到list类型的对象
          • 将item类型的对象提交给管道进行持久化存储的操作
          • 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
          • 在配置文件中开启管道
        • 好处:
          • 通用性强
      • 面试题
        将爬取到的数据一份存储到本地,一份存储到数据库,如何实现
        • 管道文件中一个管道类对应的是将数据储存到一个平台
        • 爬虫文件提交的item只会给管道文件中第一个被执行的管道类接受
        • process_item中的return item 表示将item传递给下一个即将被执行的管道类
  • 基于Spider的全站数据爬取

    • 就是将网站中某板块下的全部页码对应的页面数据进行爬取
    • 需求:
    • 实现方式:
      • 将所有页面的url添加到start_urls例表中(不推荐,麻烦)
      • 自行手动进行请求发送(推荐)
        • 手动发送请求:
          yield scrapy.Request(url=new_url,callback=self.parse) callback回调函数专门用作于数据解析
  • scrapy五大核心组件:

    • 引擎
      • 用来处理整个数据流处理,触发事务(框架的核心)
    • 调度器
      • 用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回,可以想象成一个URL(抓取网页的地址或者说是链接)
      • 的优先队列,由它类决定下一个抓取的网址是什么,可以去除重复的网址
    • 下载器:
      • 用于下载网页端的内容,并将网页的内容返回给蜘蛛(Scrapy 下载器是建立在twisted这个高效的异步模型)
    • 爬虫
      • 爬虫主要用来干活,用于从特定的网页中提取自己需要的内容,即所谓的实体item,用户也可以从中提取出链接让Scrapy继续爬取下一个页面
    • 项目管道
      • 负责处理爬虫从网页中抽取到的实体,主要的功能是持久化实体,验证实体的有效性,清楚不需要的信息,当当页面被爬虫解析后
      • 将被发送到项目管道,并经过几个特定的次序处理数据
  • Scrapy请求传参:

    • 使用场景:如果要爬取的数据不在同一张页面中,(深度爬取)
    • 需求:爬取Boss直聘
  • 图片数据爬取之ImagesPipeline

    • 基于scrapy爬取字符串类型的数据和爬取图片类型的数据的区别
      • 字符串:只需要用xpath进行解析且提交管道类进行数据持久化存储
      • 图片:xpath解析出来的图片的src的属性值,单独的对图片地址发起请求获取图片二进制类性的数据
    • ImagesPipeline
      • 只需要将img的src的属性进行解析,提交到管道,管道就会对图片的src发送请求获取图片的二进制数据据
    • 需求:爬取站长素材中的高清图片
    • 使用流程:
      • 数据解析 (图片的地址)
      • 将存储图片地址的item提交到指定的管道类
      • 在管道文件中自定制一个基于ImagesPipeline的一个管道类
        • 对item中的图片进行请求操作

          def get_media_requests(self, item, info):
          yield scrapy.Request(item[‘src’])

          定制土图片的名称 指定图片的储存路径需要在strings文件中指定

          def file_path(self, request, response=None, info=None,time=None):
          imgName = request.url.split(’/’)[-1]
          return imgName

          def item_completed(self, results, item, info):
          return item # 返回给下一个即将被执行的管道类

        • 在配置文件中:
          - 指定图片储存的目录:IMAGES_STORE = ‘./imgs chao’
          - 指定开启的管道:自定制的管道类

  • 中间件

    • 下载中间件
      • 位置:引擎和下载器之间
      • 作用;批量拦截到整个工程所有的请求和响应
      • 拦截请求:
        • UA伪装:process_request
        • 代理:process_exception return request
      • 拦截响应:
        • 篡改响应数据,响应对象
        • 需求:爬取网易新闻中的新闻数据(标题和内容)
          • 通过网易新闻的首页解析出五大板块对应的详情页的url(详情页没有动态加载)
          • 每一个板块对应的新闻数据标题都是动态加载出来的
          • 通过解析出每一条新闻详情页的url获取详情页的源码,解析出新闻内容

CrawlSpider 类 Spider的一个子类
- 全站数据爬取的方式
- 基于Spider:手动请求
- 基于CrawlSpider
- CrawlSpider的使用
- 创建一个工程 scrapy startproject xxx
- cd xxx
- 创建爬虫文件(CrawlSpider):
- scrapy genspider -t crawl xxx www.xxx.com
- 连接提取器
- 作用: 根据指定的规则(allow) 进行指定的链接提取
- 规则解释器:
- 作用: 将链接提取器取到的链接进行指定规则的解析(callback)的解析
需求:爬取sun网站中的编号,新闻标题,新闻内容,标号
- 分析爬取的页面没有在同一张页面中
- 1.可以使用链接提取器提取所有的页码链接
- 2.让链接提取器提取所有的新闻详情页的链接

  • 分布式爬虫:
    • 安装一个scrapy-redis组件
    • 原生的scrapy是不可以实现分布式爬虫,必须要让scrapy结合scrapy-redis组件一起实现分布式爬虫
    • 为什么原生的scrapy不可以实现分布式?
      • 调度器不可以被分布式集群共享
      • 管道不可以被分布式集群共享
    • scrapy-redis组件单的作用
      • 可以给原生的scrapy框架提供可以被共享的管道和调度器
    • 实现流程:
上一篇:python基础3-列表,元组,字典


下一篇:classfile解析的内容