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

Scrapy爬虫实战:如何正确跟随链接并提取球员详情数据

冬磊酱_5351

冬磊酱_5351

发布时间:2026-07-27 23:19:26

|

358人浏览过

|

来源于php中文网

原创

Scrapy爬虫实战:如何正确跟随链接并提取球员详情数据

本文详解scrapy中多级页面抓取的核心逻辑——通过分离parse与parse_player方法实现“列表页→详情页”链式爬取,避免数据丢失,并给出健壮的css选择器写法与调试技巧。

本文详解scrapy中多级页面抓取的核心逻辑——通过分离parse与parse_player方法实现“列表页→详情页”链式爬取,避免数据丢失,并给出健壮的css选择器写法与调试技巧。

在使用Scrapy进行体育数据采集(如FIFA Index球员信息)时,一个典型且易出错的场景是:从列表页提取所有球员链接后,逐个跳转至详情页抓取姓名、体重等字段,却始终返回空结果。问题根源往往并非网站反爬或网络异常,而是Scrapy回调机制与作用域理解偏差所致。

? 核心误区:在错误的作用域中尝试提取详情页数据

原代码中,开发者试图在parse()方法内直接对response调用response.css("h5.card-header::text").get()——但此时的response仍是列表页响应(即https://www.fifaindex.com/players/?...),而非每个球员的详情页。因此,所有CSS选择器均在列表页DOM中查找,自然无法命中详情页上的<h5 class="card-header">元素。

✅ 正确做法是:将详情页解析逻辑封装为独立方法,并作为response.follow()的回调函数。Scrapy会自动将新页面的response对象传入该回调,确保上下文精准匹配。

✅ 正确实现:分层解析 + 显式回调

以下为优化后的完整Spider代码(适配FIFA Index结构,已验证可用):

智能网页爬虫
智能网页爬虫

智能网页数据采集器,自动识别页面结构,批量抓取列表/表格/详情页数据,支持导出JSON/CSV/Excel,内置反爬策略适配。

下载
import scrapy

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

    def start_requests(self):
        # 使用原始URL(注意:&需为&,非&)
        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()
        self.logger.info(f"Found {len(player_links)} player links on page")

        for link in player_links:
            # 关键:使用response.follow并指定回调函数
            yield response.follow(link, self.parse_player)

        # 提取下一页链接(右上角“Next”按钮)
        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()
        # 权重字段位于多个span中,取第二个(通常为kg单位)
        weight_spans = response.css("span.data-units.data-units-metric::text").getall()
        weight = weight_spans[1].strip() if len(weight_spans) > 1 else None

        # 健壮性增强:检查关键字段是否存在
        if not name or not weight:
            self.logger.warning(f"Missing data on {response.url}: name={name}, weight={weight}")
            return

        yield {
            "url": response.url,
            "name": name.strip(),
            "weight": weight
        }

⚙️ 关键要点说明

项目 说明
response.follow() vs scrapy.Request() follow()自动处理相对URL拼接、Referer头继承,更简洁安全;若需自定义headers或meta,再选用Request。
CSS选择器健壮性 span.data-units.data-units-metric 使用连点语法精确匹配含两个class的元素,避免误选其他单位(如height)。
索引安全访问 weight_spans[1] 前加len(weight_spans) > 1判断,防止IndexError;日志记录缺失项便于调试。
allowed_domains 必填 防止Scrapy过滤掉跨子域请求(如www.fifaindex.com → fifaindex.com),提升稳定性。

? 运行与导出(快速验证)

启动爬虫并导出CSV:

scrapy crawl fifa_players -o players.csv

生成的players.csv将包含结构化数据:

url,name,weight
"https://www.fifaindex.com/player/226753/andr%C3%A9-onana/","André Onana","93 kg"
"https://www.fifaindex.com/player/237692/phil-foden/","Phil Foden","69 kg"
...

? 进阶建议

  • 添加延迟与User-Agent:在settings.py中设置DOWNLOAD_DELAY = 1和USER_AGENT,遵守robots.txt并降低被封风险。
  • 处理分页异常:next_page可能为空或指向无效URL,建议增加if next_page and 'players' in next_page:双重校验。
  • 数据清洗管道:在pipelines.py中统一处理weight字段(如提取纯数字93),便于后续分析。

遵循“列表页只负责导航、详情页专注提取”的职责分离原则,即可彻底解决“遍历链接却无数据返回”的经典陷阱。Scrapy的强大,正在于其清晰的流程抽象——让开发者聚焦业务逻辑,而非底层调度细节。

热门AI工具

更多
WorkBuddy

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

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

豆包大模型

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

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

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

5093

2023.11.10

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

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

0

2026.10.22

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

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

0

2026.10.22

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

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

0

2026.10.22

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

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

0

2026.10.22

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

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

0

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

0

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

0

2026.10.22

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

40

2026.10.22

热门下载

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

精品课程

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

共0课时 | 0人学习

Python 并发编程实战
Python 并发编程实战

共12课时 | 1.1万人学习

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

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