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


相关推荐
实名上网宋凯宣9 小时前
Django
后端·python·django
如若12310 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
砚底藏山河11 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
视觉小萌新11 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
薛定谔的猫-菜鸟程序员12 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
Ramble_Naylor14 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
Allen_LVyingbo14 小时前
NVIDIA CUDA Tile 在医疗计算中的算子形式化、算法重构与内核实现
大数据·python·算法·重构·知识图谱·健康医疗·数据库架构
云和数据.ChenGuang14 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
我命由我1234516 小时前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee
青少儿编程课堂16 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛