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


相关推荐
清水白石0089 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
山海青风9 小时前
图像识别零基础实战入门 1 计算机如何“看”一张图片
图像处理·python
彼岸花开了吗9 小时前
构建AI智能体:八十、SVD知识整理与降维:从数据混沌到语义秩序的智能转换
人工智能·python·llm
山土成旧客9 小时前
【Python学习打卡-Day40】从“能跑就行”到“工程标准”:PyTorch训练与测试的规范化写法
pytorch·python·学习
闲人编程10 小时前
消息通知系统实现:构建高可用、可扩展的企业级通知服务
java·服务器·网络·python·消息队列·异步处理·分发器
大神君Bob10 小时前
【AI办公自动化】如何使用Pytho让Excel表格处理自动化
python
Heorine10 小时前
数学建模 绘图 图表 可视化(6)
python·数学建模·数据可视化
栈与堆10 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
计算机学姐11 小时前
基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·spring·信息可视化