爬虫第六章 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']

 

 

 

  

posted @ 2019-06-19 22:12  想扣篮的小矮子  阅读(139)  评论(0编辑  收藏  举报