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


相关推荐
weixin_1562415757615 分钟前
基于YOLOv8深度学习花卉识别系统摄像头实时图片文件夹多图片等另有其他的识别系统可二开
大数据·人工智能·python·深度学习·yolo
AI_Claude_code20 分钟前
ZLibrary访问困境方案三:Web代理与轻量级转发服务的搭建与优化
爬虫·python·web安全·搜索引擎·网络安全·web3·httpx
小陈工23 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
时空无限29 分钟前
ansible 由于不同主机 python 版本不同执行报错
python·ansible
ZhengEnCi33 分钟前
P2E-Python字典操作完全指南-从增删改查到遍历嵌套的Python编程利器
python
alanesnape34 分钟前
使用AVL平衡树和列表实现 map容器 -- 附加测试/python代码
python·map·avl 平衡树·bst树·二叉树旋转
卤炖阑尾炎1 小时前
Python 网络编程实战:从 TCP/UDP 基础到高并发服务器开发
网络·python·tcp/ip
weixin_513449961 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
飞Link1 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
曾阿伦2 小时前
Python3 文件 (夹) 操作备忘录
开发语言·python