Scrapy 教程:递归爬取网站中包含指定标题的所有卡片所在页面 URL

轻明大大_4384

轻明大大_4384

2026-09-08

376人浏览

原创

Scrapy 教程:递归爬取网站中包含指定标题的所有卡片所在页面 URL

本文详解如何使用 scrapy 实现递归爬虫,自动定位并提取目标标题(如“az school safety program”)在全站所有出现位置的绝对 url,兼顾效率与合规性。

本文详解如何使用 scrapy 实现递归爬虫,自动定位并提取目标标题(如“az school safety program”)在全站所有出现位置的绝对 url,兼顾效率与合规性。

要精准抓取某张内容卡片(例如标题为 “AZ School Safety Program”)在整站中所有出现的页面 URL,不能仅靠单页 CSS 选择器匹配文本——因为标题本身不携带链接信息,真正需要的是承载该标题的网页地址。因此,核心思路是:逐页解析 → 检查页面内是否存在目标卡片 → 若存在,记录当前页面 URL → 再递归访问站内所有内部链接,持续探测。

以下是一个完整、可运行的 Scrapy 爬虫示例(需置于 spiders/ 目录下):

import scrapy

class PostsSpider(scrapy.Spider):
    name = "card"

    # 限制爬取深度,避免过度请求与服务器压力
    custom_settings = {
        'DEPTH_LIMIT': 1,
        'DEPTH_PRIORITY': 1,
        'ROBOTSTXT_OBEY': True,  # 尊重 robots.txt(推荐开启)
        'DOWNLOAD_DELAY': 1,     # 添加延时,提升友好性
    }

    def start_requests(self):
        # 明确起始 URL,避免默认 start_urls 机制引发的 callback 未定义错误
        yield scrapy.Request(url="https://lawforkids.org", callback=self.parse)

    def parse(self, response):
        # 跳过非 HTML 响应(如 PDF、图片、API 接口等)
        if 'text/html' not in response.headers.get('Content-Type', b'').decode():
            return

        # 定位所有卡片容器(根据实际 HTML 结构调整选择器)
        for card in response.css("div.card-body"):
            # 提取卡片标题文本,并清洗空格与换行
            title = card.css("h5.card-title::text").get(default="").strip()
            if title == "AZ School Safety Program":
                yield {"Url": response.url}  # 记录命中页面的绝对 URL

        # 递归发现并跟进站内链接
        for a_tag in response.css('a[href]'):
            link = a_tag.css('::attr(href)').get()
            if not link:
                continue
            absolute_link = response.urljoin(link)  # 自动补全相对路径

            # 仅跟进同一域名下的内部链接(防止爬出域外)
            if absolute_link.startswith("https://lawforkids.org"):
                yield scrapy.Request(
                    url=absolute_link,
                    callback=self.parse,
                    # 可选:启用优先级或去重键优化调度
                    # priority=10,
                    # dont_filter=False
                )

? 关键要点说明:

  • ✅ start_requests() 替代 start_urls:避免因未正确定义 parse 方法签名导致的 callback is not defined 错误;显式调用更可控。
  • ✅ 使用 response.urljoin() 处理相对 URL,确保链接绝对化,避免路径错误。
  • ✅ DEPTH_LIMIT: 1 是平衡覆盖率与性能的关键——实测已覆盖 /programs、/officers、/educators 及子路径(如 /programs/lre-academy);若需更深覆盖,可谨慎增至 2,但务必配合 DOWNLOAD_DELAY 和 ROBOTSTXT_OBEY。
  • ✅ 标题比对采用 .strip() 清洗空白符,提升匹配鲁棒性;如需模糊匹配(如含大小写/标点差异),可用 re.search(r'az.*school.*safety.*program', title, re.I) 替代严格相等。
  • ⚠️ 切勿省略 ROBOTSTXT_OBEY 和合理延迟——这是负责任爬虫的基本准则,也是避免被封禁的前提。

运行命令:

scrapy crawl card -o results.jsonl

输出为 JSONL 格式,每行一个匹配结果,便于后续清洗与分析。

最终,你将获得一份结构清晰、来源可信的全站卡片分布清单,彻底替代人工排查,高效支撑内容审计、SEO 分析或知识图谱构建等场景。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
免费爬虫工具有哪些
免费爬虫工具有哪些

免费爬虫工具有Scrapy、Beautiful Soup、ParseHub、Octoparse、Webocton Scriptly、RoboBrowser和Goutte。更多关于免费爬虫工具的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.10

5353

9

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

60

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

40

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

80

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

80

25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习