zoukankan      html  css  js  c++  java
  • 爬虫第六章 scrapy的具体应用 5大核心组件 scrapy持久化存储 请求传参

    scrapy的数据解析

    在scrapy中我们使用xpath解析到的数据都被封装到了一个selector对象中,我们需要的字符串数据也都封装到这个对象中了
    如果我们可以确定xpath返回的列表中只有一个对象,用extract_first(),如果不是一个值,则用extract()即可.

    scrapy的持久化存储

    scrapy的持久化存储分为两种:
        一种是基于终端指令的,另一种是基于管道的
    
    基于终端指令:
        可以将parse方法的返回值对应的数据进行本地磁盘的持久化存储
        scrapy crawl pcName -o fliePath
        缺点: 局限性较强(只能是特定的文件格式,并且数据不能存储到数据库中)
        优点: 便捷,简单
    基于管道:
      1.数据解析
      2.在item类中进行相关属性的封装
      3.实例化一个item类型的对象
      4.将解析到的数据存储到item对象中
      5.将item交给管道
      6.在配置文件中开启管道
    注意事项:
      爬虫文件提交的item只会提交到第一个被执行的管道中
      在管道类中的process_item方法中return item,是将item传递给下一个即将被执行的管道类
      习惯: 在每个process_item方法执行后都需要写return item

    进行全站数据爬取

    手动发起get请求
        yield scrapy.Request(url,callback)
    
    手动发起post请求
        yield scrapy.FormRequest(url,callback,formdata)
            url : 向哪个网站发起请求
            callback : 回调函数
            formdata: 请求时发送的参数
    
    如果想要将起始列表中的url进行post请求的发送,需要重写父类中的方法
    
    def start_requests(self):
        for url in self.start_urls:
            data={
                'name':'xixi'
                }
            yield scrapy.FormRequest(url,callback=self.parse,formdata=data)

    scrapy的五大核心组件

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

    执行流程:

    1.爬虫对象将url封装成请求对象发送给引擎(可能有很多个请求对象)
    
    2.引擎拿到请求对象之后,会把他传递给调度器,调度器中会先经过过滤器过滤掉重复的请求对象,然后将这些对象存放在队列中
    
    3.将队列中的一个对象传递给引擎
    
    4.引擎将对象传递给下载器
    
    5.下载器通过发送请求向互联网发送请求
    
    6.互联网返回给下载器数据
    
    7.下载器将数据传递给引擎
    
    8.引擎将数据传递给爬虫数据,然后进行数据解析等操作
    
    9.解析完成后,爬虫程序将解析的数据发送给引擎.
    
    10.引擎将数据传递给管道,进行数据的持久化存储

    请求传参:

    使用场景:
        爬取的数据没有在用一个页面上
    如何实现:
        在手动发送请求时,可以将一个字典传递给回调函数
        yield scrapy.Resquest(url,callback,meta)
        callback取值meta字典值:
            response.meta['xxx']

      

  • 相关阅读:
    代理模式
    工厂模式
    Mysql索引数据结构为什么是B+树?
    mxgraph中mxStencil使用经验
    !dbobji.cpp@8615
    ForkJoinPool线程池
    保障线程安全的设计技术
    Java利用线程工厂监控线程池
    使用Arthas分析线上问题
    使用规则执行器代替 if else 判断
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/11048043.html
Copyright © 2011-2022 走看看