前言
在 Scrapy 中要抓取和解析一些逻辑内容和提取网站的链接,其实都是需要在 Spider 中完成的。在上一篇文章中我们介绍了 Scrapy 框架的简单使用,后面一些文章我们要陆续介绍框架里面的 Spider、配置、管道、中间件等。
Scrapy 框架分为 Spider 爬虫和 CrawlSpider(规则爬虫),本篇文章主要介绍 Spider 爬虫的使用。
Spider
在实现 Scrapy 爬虫项目时,最核心的类就是 Spider 类了,它定义了如何爬取某个网站的流程和解析方式。简单来讲,Spider 要做的事就是如下两件。
- 定义爬取网站的动作
- 分析爬取下来的网页
对于 Spider 类来说,整个爬取循环如下所述。
- 以初始的 URL 初始化 Request,并设置回调函数。当该 Request 成功请求并返回时,将生成 Response,并作为参数传给该回调函数。
- 在回调函数内分析返回的网页内容。返回结果可以有两种形式:一种是解析到的有效结果返回字典或 Item 对象。下一步可经过处理后(或直接)保存;另一种是解析得下一个(如下一页)链接,可以利用此链接构造 Request 并设置新的回调函数,返回 Request。
- 如果返回的是字典或 Item 对象,可通过 Feed Exports 等形式存入到文件,如果设置了 Pipeline 的话,可以经由 Pipeline 处理(如过滤、修正等)并保存。
- 如果返回的是 Request,那么 Request 执行成功得到 Response 之后会再次传递给 Request 中定义的回调函数,可以再次使用选择器来分析新得到的网页内容,并根据分析的数据生成 Item。
通过以上几步循环往复进行,便完成了站点的爬取。
我们以星巴克网站为例,为大家介绍 Spider 类,首先创建项目和创建爬虫。
具体步骤如下:
scrapy startproject starbuckspro
cd starbuckspro
scrapy genspider starbucks https://www.starbucks.com.cn
此时我们就可以看到,有爬虫文件产生。大家看到类 StarbucksSpider 继承自 scrapy.Spider,这个类是最简单最基本的 Spider 类,任何其他的 Spider 必须继承这个类,包括后文要说明的一些特殊 Spider 类也都是继承自它。
这个类里提供了 start_requests() 方法的默认实现,读取并请求 start_urls 属性,并根据返回的结果调用 parse() 方法解析结果。
另外它还有一些基础属性,下面对其进行讲解:
- name: 爬虫名称,是定义 Spider 名字的字符串。Spider 的名字定义了 Scrapy 如何定位并初始化 Spider,所以其必须是唯一的。如果该 Spider 爬取单个网站,一个常见的做法是以该网站的域名名称来命名 Spider。
- allowed_domains: 允许爬取的域名,是可选配置,不在此范围的链接不会被跟进爬取。
- start_urls: 起始 URL 列表,当我们没有实现
start_requests()方法时,默认会从这个列表开始抓取。 - custom_settings 和 settings: 可以进行一些设置或者获取一些全局的设置。
- crawler: 属性是由
from_crawler()方法设置的,代表的是本 Spider 类对应的 Crawler 对象。
除了一些基础属性,Spider 还有一些常用的方法:
- start_requests(): 此方法用于生成初始请求,它必须返回一个可迭代对象,此方法会默认使用
start_urls里面的 URL 来构造 Request,而且 Request 是 GET 请求方式。如果我们想在启动时以 POST 方式访问某个站点,可以直接重写这个方法,发送 POST 请求时我们使用FormRequest即可。 - parse(): 当 Response 没有指定回调函数时,该方法会默认被调用,它负责处理 Response,处理返回结果,并从中提取出想要的数据和下一步的请求,然后返回。该方法需要返回一个包含 Request 或 Item 的可迭代对象。


