10.6 Scrapy:Python 网页爬取框架


文章目录

  • 前言
  • [一、 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 框架由以下几个关键组件构成:

  1. 引擎(Scrapy Engine):控制所有组件之间的数据流和通信,是整个框架的核心调度器。
  2. 调度器(Scheduler):接收引擎发来的请求(Request),进行队列管理和调度,确保请求有序执行。
  3. 下载器(Downloader):负责下载网页内容,将响应(Response)返回给引擎。
  4. 爬虫(Spider):解析响应数据,提取结构化信息(Item)和新的待爬取 URL。
  5. 项目管道(Item Pipeline):对提取的数据进行后期处理,如清洗、验证和存储。
  6. 下载中间件(Downloader Middlewares):自定义扩展下载过程,例如设置代理、修改请求头等。
  7. 爬虫中间件(Spider Middlewares):处理引擎与爬虫之间的通信,可自定义请求和过滤响应。
  8. 开发重点:实际开发中主要需要实现 Spider 和 Item Pipeline,而中间件可根据需求选择性扩展。

1.2 工作流程

  1. Spider 生成初始请求,通过引擎发送给调度器。
  2. 调度器对请求进行排序和整理,返回给引擎。
  3. 引擎将请求经由下载中间件发送给下载器。
  4. 下载器获取网页响应,经中间件返回给引擎。
  5. 引擎将响应传递给 Spider 进行解析。
  6. Spider 提取数据(通过引擎交给 Item Pipeline 处理)和新 URL(返回给调度器继续爬取)。
  7. 循环执行直到没有新的请求为止。

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:禁用去重


相关推荐
从零开始学习人工智能3 小时前
【踩坑实录】WSL2 解决 onnxruntime\-gpu ImportError: libcudart\.so\.13 无 CUDA13 运行库问题
python
卷无止境4 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
zhanghaha13144 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
Python私教5 小时前
API 输出模型怎么设计:从 model_dump() 到显式展示层
python·fastapi
Python私教5 小时前
本地 AI 工具服务该绑定 127.0.0.1 还是 0.0.0.0?
python·fastapi
卷无止境5 小时前
FastAPI 的Admin面板生态
后端·python
ctlover6 小时前
Streamlit 框架
python
ι:6 小时前
MATLAB 与 Python 搭建无人机地面站:优势、劣势与选型逻辑
python·matlab·无人机
船厂电气自动化ai大模型6 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
jufeng13077 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 7 篇】
python·ai agent·权限系统