Scrapy学习笔记

一、爬虫框架Scrapy总览

Scrapy学习笔记

图片来源于网络

上图就是整个Scrapy的架构图了,主要包括部分作用如下:

  • Scrapy Engine:爬虫引擎,负责制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。简单来说,就是负责Spiders、ItemPipeline、Downloaders和Scheduler之间的信息传递。
  • Scheduler:调度器,负责接受引擎发送过来的requests请求,并按照一定的方式排列这些请求,等待Scrapy Engine来请求时交给它。
  • Downloader:下载器,负责下载Scrapy Engine发送的所有Requests请求,并将获取的Responses交给Scrapy Engine,由其交给Spiders来处理。
  • Spiders:负责处理所有的Responses,从中分析提取数据,获取Item需要的数据,并将需要跟进的URL提交给Scrapy Engine,由其交给Scheduler。
  • Item Pipeline:项目管道,负责处理Spiders中得到的Item,像去重、持久化等操作。
  • Downloader Middlewares:中间下载器,可以让你自定义扩展下载功能的组件。
  • Spider Middlewares:用于扩展Scrapy Engine和Spiders之间交互的组件。

Scrapy执行流程:

  1. Scrapy Engine从Spiders获取初始的URL,并将这些request交给Scheduler进行排列。
  2. Scrapy Engine从Scheduler获取处理好的request。
  3. Scrapy Engine将request传递给Downloader,让其下载。
  4. Downloader将下载好的Responses返回给Scrapy Engine。
  5. Scrapy Engine将Responses交给Spiders进行处理,默认传递给Spiders的parse()函数,所以Spiders必须定义这个函数。
  6. Spiders提取出Item需要的数据和接着要爬的URL,并将这些数据和URL交给Scrapy Engine。
  7. Scrapy Engine将数据交给Item Pipeline进行处理,将URL交给Scheduler
  8. 重复步骤2,直到Scheduler中不存在任何requests,程序停止。

二、一个简单的使用Scrapy的例子:

目标:爬取Python官网(https://www.python.org/),获得网页的title、url和body,暂时不存储数据。

1.创建一个Scrapy项目,使用如下命令(项目名为python_project,可以自己更改):

scrapy startproject python_project

创建项目后,在命令运行的目录下会产生一个与项目同名的文件夹,其结构大致如下:

Scrapy学习笔记

这些文件的作用大致如下:

  • scrapy.cfg:项目的配置文件
  • items.py:用于定义临时存储的数据,所有需要获取的数据都必须在这个文件中有定义。
  • middlewares.py:用于定义中间器,像Spider Middlewares和Downloader Middlewares
  • pipelines.py:用于处理获取的数据,像去重、持久化等。
  • settings.py:项目的配置文件
  • spiders文件夹:用于存放Spiders代码的目录

2.定义Item:item是保存爬取到的数据的容器,其使用方法与python字典类似,并且踢动额外的保护机制来避免拼写错误导致的未定义字段错误。

通过创建一个scrapy.Item类,并定义类型为scrapy.Field的类属性来定义一个Item。

这里,我们需要从网站获取title、url和body,因此在item中定义相应的字段。编辑items.py文件如下:

import scrapy

class PythonProjectItem(scrapy.Item):
    title = scrapy.Field()
    url = scrapy.Field()
    body = scrapy.Field()

3.编写Spider:Spider是用户编写用于从网站爬取数据的类,包含了:一个用于下载的初始URL,如何跟进网页中的链接(如域名限制等)以及如何分析网页中的内容,提取生成item的方法。

为了创建一个Spider,必须继承scrapy.Spider类,并定义以下三个属性或方法:

  • name:用于区别不同的Spider,因此每个Spider的名字必须是唯一的。这样,就可以通过name来直接启动爬虫
  • start_url:定义Spider启动时进行爬取的URL列表,后续的URL则从初始的URL获取的数据中提取。
  • parse( ):每个URL完成下载后生成的Response对象会作为唯一参数传递给该函数。这个方法负责解析返回的数据(response data),提取数据生成item以及生成要进一步处理的URL的Resuest对象。

这里我们在parse函数中不定义获取URL的实现,只解析要获取的数据。因此这个爬虫只有一个URL可用,爬虫爬取完这个网页便会停止。在spiders目录下新建python_spider.py文件,编辑如下: