Scrapy项目运行数据流总览 AND 几个重要的组件、中间件分析

以下的内容均为自己看书自学的分享,加深自己对于Scrapy的整体框架的理解。

1. 数据流总览图

1.1 Scrapy整体框架图和数据流总览

图片为自己学习总结所画,有不对的地方可以评论私信指出。
在这里插入图片描述

2. 重要的组件和中间件分析

2.1 Spider

2.1.1 Spider运行流程

Spider是最核心的类,定义了如何爬取某个网站的流程和解析方式。简单的来说其所要做的就是两件事:

  1. 定义爬取网站的动作
  2. 分析爬取下来的网页

整个的爬取流程如下:

  1. 以初始的URL初始化Request,并设置回调函数。当该Request成功请求返回后,Response生成并作为参数传递给回调函数。
  2. 在回调函数内分析返回的网页内容。返回的结果有两种形式,(1)解析到的有效结果返回字典或Item对象,它们可以经过处理后直接保存。(2)解析得到的下一个链接,可以利用此链接构造Request并设置新的回调函数,返回Request等待后续的调度。
  3. 如果返回的是字典或Item对象,可以通过命令行的方式直接存入本地文件。若设置了Pipeline的话,便利用其中的自定义的方法进行处理后保存。
  4. 如果返回的是Request对象的话,那么Request执行成功后得到的Response会被传递给Request中定义的回调函数,在回调函数中我们可以再次使用选择器来分析新的网页内容,并根据分析的数据生成Item。

2.1.2 Spider类的基础属性

Spider默认继承的是scrapy.spiders.Spider。提供了默认的 start_requests()方法的实现,读取并请求start_urls属性,并根据返回结果调用parse()方法解析结果。

  1. name:爬虫的名称,必须是唯一的,创建项目的时候自动生成。不过可以生成多个相同的Spider实例,数量没有限制。
  2. allowed_domains。允许爬取的域名,是可选配置,不在此范围内的连接不会跟进爬取。
  3. start_urls。起始的URL列表,当没有实现start_requests()方法时,默认会从这个列表开始抓取。
  4. custom_settings。一个字典,专属于Spider的配置,此设置会覆盖项目的全局设置。此设置必须在初始化前被更新,必须定义成类的变量。
  5. crawler。它是由from_crawler()方法设置的,利用它可以获取项目的一些配置信息,如在settings中配置的信息。
  6. start_requests()。此方法用于生产初始请求,他必须返回一个可迭代的对象。此方法默认从start_urls里面的URL来构造Request,而且Request时GET的请求方式。如果我们想在启动时以POST的方式来访问某个站点,可以直接重写这个方法,发送POST请求时使用FromRequest即可。
  7. parse()。当Response没有指定回调函数的时候,该方法会被默认使用,来处理Response,处理返回结果,并从中提取想要的数据和下一步的请求。
  8. closed()。当Spider关闭时该方法自动调用。

2.2 Downloader Middleware

下载中间件,处于Scrapy的Request和Response之间的处理模块。

2.2.1 架构分析

Scheduler从队列中拿出来一个Request发送给Downloader执行下载,这个过程会经过Downloader Middleware 的处理。当Downloader将Request下载完成后得到的Response返回给Spider处理的时候,也会经过Downloader Middleware 进行处理。

我们通过其可做的修改有两处:

1.在Scheduler调度出队列的Request发送给Downloader下载之前,也就是我们可以在Request执行下载任务之前对其进行处理。

2.在下载后生成Response发送给Spider之前,也就是我们可以在生成Response发送给Spider解析之前进行修改。

2.2.2 三个核心方法

(1)process_request(request,spider)。这个方法处理情况一,调用其方法对Request请求进行修改,比如修改头部请求等,返回值必为None,Response,Request对象之一,或者抛出异常。

(2)process_response(request,response,spider)。这个方法处理情况二,调用其对Response进行修改,比如修改状态码等。返回值必为None,Response,Request对象之一,或者抛出异常。

(3)process_exception(request,exception,spider)。处理产生的异常,使得项目可以顺利的执行完全程。

只需要实现其中一个方法,便可以定义一个 Downloader Middleware。

2.2.3 启动自定义的 Downloader Middleware

在settings.py中,将DOWNLOADER_MIDDLEWARE取消注释,设置为:

DOWNLOADER_MIDDLEWARE = {
	'项目名.middlewares.自己定义的middleware的名字':503(数字为优先级)
}

2.3 Item Pipeline

2.3.1 主要功能

  1. 清理HTML数据
  2. 验证爬取的数据,检查爬取字段
  3. 查重并丢弃重复的内容
  4. 将爬取的数据返回给数据库

2.3.2 核心方法

必须要实现的方法 process_item(item,spider)

被定义的 Item Pipeline 会默认调用这个方法对Item进行处理。比如将数据处理或将数据保存如数据库等。它必须返回Item类型的值或抛出一个DropItem异常。

class PymysqlPipeline(object):
    #连接数据库
    def __init__(self):
        self.connect = pymysql.connect(
            host = 'localhost',
            database = 'image_360',
            user = 'root',
            password = '123456',
            charset = 'utf8',
            port = 3306
        )
        # 创建游标对象
        self.cursor = self.connect.cursor()

    # 此方法是必须要实现的方法,被定义的 Item Pipeline 会默认调用这个方法对 Item 进行处理
    def process_item(self,item,spider):
        cursor = self.cursor
        sql = 'insert into image_information(id,pic_desc,title,url,thumb) values (%s,%s,%s,%s,%s)'
        cursor.execute(sql,(
            item['id'],item['pic_desc'],item['title'],item['url'],item['thumb']
        ))
        # 提交数据库事务
        self.connect.commit()

        return item

2.3.3 三个实用的方法

  1. open_spider(self,spiser)。在Spider开启的时候别调用,可以做一些初始化的操作,如开启数据库的连接等。
  2. close_spider(spider)。Spider关闭的时候调用,做一些收尾的操作,如关闭数据的连接等。
  3. from_crawler(cls,crawler)。一个类方法,用 @classmethod 标识,是一种依赖注入的方式。它的参数时crawler,通过crawler对象,可以拿到Scrapy所有核心组件,如全局配置信息,然后创建一个Pipeline实例。参数cls是Class,最后返回一个Class实例。

猜你喜欢

转载自blog.csdn.net/zc666ying/article/details/106601578
今日推荐