当前位置:首页 > 技术 > 正文内容

Scrapy 进阶实战:CrawlSpider 架构与规则引擎解析

访客 技术 2026年9月5日 1

CrawlSpider 工作机理

CrawlSpider 继承了基础的 Spider 类,专为自动化多页爬取场景设计。其核心能力在于自动处理网页间的关联跳转:从初始 URL 列表开始抓取内容,利用预定义的规则识别并提取后续页面的链接,进而发起新的请求,形成闭环的爬取路径。


sequenceDiagram
participant Scheduler as 调度器
participant Downloader as 下载器
participant Parser as 规则引擎
participant Target as 目标数据
start_urls -.->Scheduler
Scheduler -->>Downloader: 发起请求
Downloader -->>Parser: 返回响应文本
Parser -->>Target: 提取有效信息
Parser -->>Scheduler: 提交新 URL

上述序列图展示了请求在调度、下载及规则处理之间的流转过程。

模板生成

通过以下命令行指令可快速初始化基于 CrawlSpider 的项目结构:

scrapy genspider -t crawl 项目名称 域名范围

规则对象 (Rule Object)

规则定义位于 scrapy.spiders 模块下(注:旧版本为 scrapy.contrib)。每个 Rule 实例控制特定响应内容的解析逻辑。

from scrapy.spiders import Rule
Rule(
    link_extractor=LinkExtractor(...),
    callback=None, 
    cb_kwargs=None, 
    follow=True, 
    process_links=None, 
    process_request=None
)

各参数具体含义如下:

  • link_extractor: 负责指定如何从页面中提取链接对象(通常配合 LinkExtractor 使用)。
  • callback: 当匹配到链接后触发的回调函数名。此处需注意:
    必须避免使用名为 parse 的函数作为回调。因为 CrawlSpider 基类依赖 parse 方法处理默认流程,若用户手动覆盖会导致爬虫逻辑冲突或失效。
  • follow: 布尔值。若设为 True,则对提取到的链接继续执行后续规则;默认为 True。
  • process_links: 用于接收并过滤提取到的原始链接集合。
  • process_request: 用于拦截并修改生成的 Request 对象。

链接提取器 (LinkExtractor)

这是实现定向抓取的核心组件,主要用于分析 Response 中的超链接。

核心方法

所有提取器共享 extract_links(response) 公共接口,输入 Response 对象,输出包含 scrapy.link.Link 对象的列表。

配置参数详解

from scrapy.linkextractors import LinkExtractor

LinkExtractor(
    allow=(),          # 正则白名单
    deny=(),           # 正则黑名单
    allow_domains=(),  # 允许抓取的域名
    deny_domains=(),   # 禁止抓取的域名
    restrict_xpaths=(),# XPath 定位过滤
    tags=('a','area'), # 标签类型
    attrs=('href'),    # 属性名称
    canonicalize=True, # 是否统一 URL 格式
    unique=True,       # 是否去重
    process_value=None # 自定义值处理
)
  • allow/deny: 支持传入正则表达式元组进行 URL 白名单或黑名单过滤。留空表示全部匹配或不加限制。
  • allow_domains: 限制仅提取指定域名的绝对路径链接。
  • restrict_xpaths: 结合 XPath 表达式限定搜索范围,仅在该节点内查找符合要求的链接。

交互式验证

可在 Shell 环境中即时测试提取效果:

  1. 启动 Shell 模式:
    scrapy shell "https://www.example-domain.com/page"
  2. 导入模块:
    from scrapy.linkextractors import LinkExtractor
  3. 创建实例并筛选:
    lex = LinkExtractor(restrict_xpaths="//div[@class='pagination']/a")
  4. 执行提取:
    links = lex.extract_links(response)

完整爬虫示例

将提取器集成至 CrawlSpider 中,并处理具体的业务数据字段:

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from myproject.items import BookContentItem

class ChapterListSpider(CrawlSpider):
    name = "book_list_crawler"
    allowed_domains = ["target-site.com"]
    start_urls = [
        "http://www.target-site.com/series/1/read/101"
    ]

    rules = [
        Rule(
            LinkExtractor(
                restrict_xpaths='//div[@class="reader-nav"]/a[last()]'
            ),
            callback='parse_book_content',
            follow=False
        )
    ]

    def parse_book_content(self, response):
        # 提取正文内容
        raw_text = response.xpath("//div[@id='main-content']/text()").getall()
        
        # 组装 Item
        item_data = BookContentItem()
        item_data['full_text'] = "".join(raw_text)
        
        yield item_data

在此代码结构中,需注意 rules 列表里的回调写法:
1. 函数名称必须使用字符串形式引用(如 'parse_book_content')。
2. 严禁命名 parse 以避免基类冲突。
3. 确保参数顺序与 Rule 构造函数定义一致。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。