前言
在 Scrapy 里,真正负责抓取和解析页面的还是 Spider。上一篇已经把框架跑起来了,这里就顺着往下看 Spider、Item 和 Pipeline 这条主线。它们不是摆设,尤其是项目一大,分工不清楚,后面很容易乱。
Scrapy 里常见的爬虫类型有 Spider 和 CrawlSpider。前者更自由,适合自己控制请求和解析逻辑;后者更偏规则驱动。这里先看最基础的 Spider。
Spider
Spider 是 Scrapy 爬虫的核心类,负责两件事:发起请求,解析响应。流程并不复杂,但实际写项目时,很多细节都落在这里。
- 用初始 URL 构造 Request,并指定回调函数。
- 回调里解析 Response,提取数据,或者继续生成新的 Request。
- 如果返回的是字典或 Item,后面可以交给 Feed Exports 或 Pipeline 处理。
- 如果返回的是 Request,Scrapy 会继续请求,直到把整个抓取链路跑完。
这种循环机制其实很直白:请求、解析、再请求。写顺了之后,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 的名字,Scrapy 用它来定位和启动爬虫。一般要保证唯一。抓单站点时,直接用域名命名通常最省事。
- allowed_domains:允许跟进的域名范围,超出这个范围的链接不会被继续抓取。
- start_urls:起始 URL 列表。没重写
start_requests()时,Scrapy 就从这里开始。 - custom_settings 和 settings:用来覆盖或读取配置。
- crawler:由
from_crawler()注入,代表当前 Spider 对应的 Crawler 对象。
常用方法也就这几个:
- start_requests():生成初始请求,默认把
start_urls里的地址封成 GET 请求。要在启动阶段发 POST,通常就得自己重写它,配合FormRequest。 - parse():没有显式指定回调时默认走这里,负责处理响应、提取数据、继续生成请求。返回值一般是包含 Request 或 Item 的可迭代对象。
- closed():Spider 关闭时调用,适合做收尾工作,比如释放资源。
这篇里要抓的是星巴克菜单页,目标很明确:把菜单名称和图片地址提出来保存。
parse() 收到的就是页面响应,接下来只要从页面中找出名称和图片链接,然后封装成结构化数据就行。这里通常会同时改 parse() 和 items.py。
Item
爬虫抓回来的内容往往很散,Item 的作用就是把这些字段收拢成固定结构。直接用字典也能写,但一旦项目里爬虫多了,字典字段名一乱,排查起来会很烦。Item 至少能把字段声明清楚。
这个例子里只保存名称和图片链接,items.py 可以这么写:
scrapy
(scrapy.Item):
name = scrapy.Field()
image_url = scrapy.Field()


