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


相关推荐
开源技术2 小时前
深入了解Turso,这个“用Rust重写的SQLite”
人工智能·python
u0109272713 小时前
RESTful API设计最佳实践(Python版)
jvm·数据库·python
我材不敲代码7 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
0思必得09 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
韩立学长9 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
qq_192779879 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u01092727110 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊10 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
Imm77710 小时前
中国知名的车膜品牌推荐几家
人工智能·python
tudficdew10 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python