初识Scrapy 爬虫框架

之前写的爬虫差不多都是用requests发出请求然后通过BeautifulSoup进行解析获取数据,最近接触到了一个python的爬虫框架Scrapy。前后者的区别有点组装机和品牌机之间的区别。

为什么要爬虫框架

  • 将精力更多放在提取数据上,很多其他的模块(比如下载模块)不需要自己写
  • 使用异步模式,提高速度,不要自己去实现异步框架
  • 使用已有的轮子,大量减少代码量

框架架构

架构图
Scrapy Engine: 这是引擎,负责Spiders、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等等!

Scheduler(调度器): 它负责接受引擎发送过来的requests请求,并按照一定的方式进行整理排列,入队、并等待Scrapy Engine(引擎)来请求时,交给引擎

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spiders来处理

Spiders:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),业务逻辑的主要部分

Item Pipeline:它负责处理Spiders中获取到的Item,并进行处理,比如去重,持久化存储(存数据库,写入文件,总之就是保存数据用的)

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spiders中间‘通信‘的功能组件(比如进入Spiders的Responses;和从Spiders出去的Requests)

Tutorial

创建项目

通过以下命令创建一个tutorial项目

1
scrapy startproject tutorial

运行以后,将产生一个tutorial文件夹,含有以下的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tutorial/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py

创建第一个Spider

  • 通过一个继承scrapy.Spider的类实现主要的功能,名字通过name定义
  • 定义一个start_requests函数(返回iterable of Requests),提供给Spider爬取的URL
  • 以上的start_request有一个快捷方式:直接指出start_urls需要爬取的URL lists
  • response是通过下载器在所给的URL中下载的内容
  • 定义一个parse 函数对响应(response)进行处理解析
  • 通过response.urljoin方法找到下一个URL链接,通过response.follow 方法使用快捷方式直接发出新的请求
  • 在parse方法中返回数据,或者在启动爬虫的时候加上参数,使得数据得到保存

Selectors

取出response中的内容

  • 通过css方法找到指定的标签或者模块
  • extract()取出response中的内容
  • 也可以使用xpath方法找到想要找的模块
  • 通过scrapy shell + 网址 可以在shell中对response进行处理(常用于测试)

Item类

在Scrapy爬虫框架中,Item类的作用是帮助我们把爬取的数据结构化表示
向前承接爬虫爬取的数据,向后为后面的数据持久化做准备
在project目录下默认创建的item.py文件可能无法引入到我们的爬虫文件中来,我们可以将这个item.py文件移动到项目根目录下