讲师中心 微信公众号
AI工具推荐 视频效率加速

Scrapy 多层页面爬取实战:从球员列表页跳转到详情页提取姓名与体重数据

秋萱君_6000

秋萱君_6000

发布时间:2026-07-29 10:09:24

|

698人浏览过

|

来源于php中文网

原创

Scrapy 多层页面爬取实战:从球员列表页跳转到详情页提取姓名与体重数据

本文详解如何使用 Scrapy 实现「列表页→详情页」两级爬取,解决常见误区(如在错误响应上下文中解析数据),并通过分离 parse 与 parse_player 方法确保每条球员数据准确提取并返回。

本文详解如何使用 scrapy 实现「列表页→详情页」两级爬取,解决常见误区(如在错误响应上下文中解析数据),并通过分离 `parse` 与 `parse_player` 方法确保每条球员数据准确提取并返回。

在体育数据采集场景中,典型的网站结构是:首页/列表页展示摘要信息(如球员缩略图、姓名、排名)→ 每个条目链接指向独立详情页 → 详情页包含完整属性(如身高、体重、惯用脚等)。若直接在列表页响应中尝试提取详情页字段(如 response.css("h5.card-header::text").get()),必然失败——因为该 CSS 选择器在列表页 HTML 中根本不存在。

原代码的核心问题在于:
❌ 将详情页数据提取逻辑错误地写在 parse() 方法中(即列表页响应的处理函数内);
❌ 使用 response.follow(new_page, self.parse) 导致所有页面都交由同一 parse 方法处理,而该方法并未区分「列表页」和「详情页」语义;
❌ for guy in response.css("div.card mb-5"): 选择器语法错误(缺少空格或逗号),且该结构实际存在于详情页而非列表页。

✅ 正确解法是遵循 Scrapy 的「职责分离」设计哲学:

  • parse() 负责发现链接:提取所有球员详情页 URL,并调用 response.follow(url, callback=self.parse_player);
  • parse_player() 专用于解析详情页:在此方法中,response 对象已加载目标球员页面,CSS 选择器可精准定位真实 DOM 元素。

以下是经过验证的完整可运行代码:

import scrapy

class FifaIndexPlayerSpider(scrapy.Spider):
    name = "fifa_players"
    allowed_domains = ["www.fifaindex.com"]

    def start_requests(self):
        # 注意:URL 中 & 需为原始字符,非 HTML 实体 &
        url = "https://www.fifaindex.com/players/?gender=0&league=13&order=desc"
        yield scrapy.Request(url, self.parse)

    def parse(self, response):
        # 提取当前页所有球员详情页链接
        player_links = response.css("figure.player a::attr(href)").getall()
        for link in player_links:
            # 使用 response.follow 自动拼接绝对 URL,并指定回调函数
            yield response.follow(link, self.parse_player)

        # 提取下一页链接(如存在)
        next_page = response.css("li.ml-auto a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, self.parse)

    def parse_player(self, response):
        # ✅ 此时 response 是球员详情页,可安全提取字段
        name = response.css("h5.card-header::text").get()
        # weight 位于 class="data-units data-units-metric" 的 span 中,通常第二个匹配项为体重(第一个可能是身高)
        weight_elements = response.css("span.data-units.data-units-metric::text").getall()
        weight = weight_elements[1].strip() if len(weight_elements) > 1 else None

        yield {
            "name": name.strip() if name else None,
            "weight": weight,
            "url": response.url  # 可选:记录数据来源,便于溯源调试
        }

关键注意事项与优化建议:

Scrapy 2.18.0
Scrapy 2.18.0

Scrapy 2.18.0 官方源码包下载,适合 Python 网页抓取、选择器解析、Item Pipeline 和异步请求调度项目升级。

下载
  1. 域名白名单严格设置
    allowed_domains = ["www.fifaindex.com"] 可防止爬虫意外跳转至外部站点(如广告、赞助商链接),提升稳定性。

  2. 链接提取健壮性增强
    若某页无球员链接(如空列表),getall() 返回空列表,for link in [] 自然跳过,无需额外判空,代码更简洁。

  3. CSS 选择器精度校验
    在浏览器开发者工具中右键检查目标元素 → “Copy selector”,推荐使用 span.data-units.data-units-metric(类名间用点连接表示同时具备多个 class),避免空格导致误匹配。

  4. 反爬基础应对(生产环境必备)

    • 在 settings.py 中启用 ROBOTSTXT_OBEY = False(需确认目标站 robots.txt 允许);
    • 添加请求延迟:DOWNLOAD_DELAY = 1(每秒最多 1 个请求);
    • 设置 User-Agent:DEFAULT_REQUEST_HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}。
  5. 数据导出与存储
    运行命令支持多种格式:

    scrapy crawl fifa_players -o players.csv      # CSV
    scrapy crawl fifa_players -o players.json     # JSON
    scrapy crawl fifa_players -o players.jl       # JSON Lines(流式,适合大数据)

通过本方案,爬虫将清晰分层:列表页只做导航调度,详情页专注数据提取。这不仅解决了“返回 None”的问题,更构建了可维护、易扩展的工业级爬取流程——后续如需增加“年龄”“国籍”“俱乐部”等字段,仅需在 parse_player() 中追加对应 CSS 提取逻辑即可。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

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

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

4593

2023.11.10

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

40

2026.10.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

140

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

140

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

100

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

100

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

120

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

320

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

220

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Scrapy 官方文档与教程
Scrapy 官方文档与教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn