文章目录
- 前言
- [一、 Scrapy 架构解析](#一、 Scrapy 架构解析)
-
- [1.1 核心组件](#1.1 核心组件)
- [1.2 工作流程](#1.2 工作流程)
- [1.3 去重机制](#1.3 去重机制)
前言
Scrapy 是一个基于 Python 开发的爬虫框架,专门用于高效地爬取网站数据并提取结构化信息。它不仅适用于数据挖掘,还可用于网站监测和自动化测试等场景。安装只需执行:pip install Scrapy。
Scrapy 的一个显著优势在于其高度可定制性。它提供了多种爬虫基类(如 BaseSpider、SitemapSpider),新版本还增强了对现代 Web 2.0 应用的支持。
一、 Scrapy 架构解析
1.1 核心组件
Scrapy 框架由以下几个关键组件构成:
- 引擎(Scrapy Engine):控制所有组件之间的数据流和通信,是整个框架的核心调度器。
- 调度器(Scheduler):接收引擎发来的请求(Request),进行队列管理和调度,确保请求有序执行。
- 下载器(Downloader):负责下载网页内容,将响应(Response)返回给引擎。
- 爬虫(Spider):解析响应数据,提取结构化信息(Item)和新的待爬取 URL。
- 项目管道(Item Pipeline):对提取的数据进行后期处理,如清洗、验证和存储。
- 下载中间件(Downloader Middlewares):自定义扩展下载过程,例如设置代理、修改请求头等。
- 爬虫中间件(Spider Middlewares):处理引擎与爬虫之间的通信,可自定义请求和过滤响应。
- 开发重点:实际开发中主要需要实现 Spider 和 Item Pipeline,而中间件可根据需求选择性扩展。
1.2 工作流程
- Spider 生成初始请求,通过引擎发送给调度器。
- 调度器对请求进行排序和整理,返回给引擎。
- 引擎将请求经由下载中间件发送给下载器。
- 下载器获取网页响应,经中间件返回给引擎。
- 引擎将响应传递给 Spider 进行解析。
- Spider 提取数据(通过引擎交给 Item Pipeline 处理)和新 URL(返回给调度器继续爬取)。
- 循环执行直到没有新的请求为止。
1.3 去重机制
Scrapy 默认启用请求去重功能,核心类 RFPDupeFilter 位于 scrapy/dupefilters.py。其关键方法 request_seen() 为每个请求生成唯一指纹:
python
python
def request_seen(self, request):
fp = self.request_fingerprint(request) # 生成请求指纹
if fp in self.fingerprints: # 检查是否已存在
return True # 重复请求
self.fingerprints.add(fp) # 添加到已处理集合
return False # 新请求
指纹生成方法 request_fingerprint() 通过 SHA1 哈希算法,综合请求方法、URL、请求体等参数计算唯一标识:
python
python
def request_fingerprint(request, include_headers=None):
fp = hashlib.sha1()
fp.update(to_bytes(request.method))
fp.update(to_bytes(canonicalize_url(request.url)))
fp.update(request.body or b'')
# ... 可选包含请求头信息
return fp.hexdigest()
去重控制:通过 dont_filter 参数控制是否去重:
dont_filter=False:启用去重(默认)
dont_filter=True:禁用去重