You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬虫遍历FIFAIndex页面但无法抓取球员数据求助

Scrapy爬虫返回None无法获取球员数据的问题解决

原代码存在的核心问题

  • 回调函数职责混淆:用同一个parse函数同时处理列表页和详情页,还错误地在列表页响应中提取详情页的DOM元素——列表页根本没有这些内容,自然返回None。
  • CSS选择器语法错误:多类选择器需要用.连接,原代码里的div.card mb-5、span.data-units data-units-metric写法错误,无法匹配到目标元素。
  • 球员链接遍历遗漏:用range(0, len(player_page)-1)遍历会漏掉最后一个球员链接。
  • 数据提取时机错误:在发送详情页请求的循环里就尝试提取数据,此时详情页的响应还没返回,完全抓不到内容。

修正后的完整代码

import scrapy

class Test2Spider(scrapy.Spider):
    name = "test2"
    
    def start_requests(self):
        home_url = "https://www.fifaindex.com/players/?gender=0&league=13&order=desc"
        yield scrapy.Request(home_url, self.parse_list)
    
    # 仅处理列表页:遍历球员链接、跟进下一页
    def parse_list(self, response):
        # 获取所有球员详情页链接并发送请求
        player_links = response.css("figure.player a::attr(href)").getall()
        for link in player_links:
            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_list)
    
    # 专门处理球员详情页:提取姓名和体重数据
    def parse_player(self, response):
        name = response.css("h5.card-header::text").get().strip()
        weight = response.css("span.data-units.data-units-metric::text").get()
        if weight:
            weight = weight.strip()
        
        yield {
            "name": name,
            "weight": weight
        }

关键改动说明

  1. 拆分回调函数:把列表页和详情页的逻辑分开,parse_list负责列表页的链接遍历和翻页,parse_player专门处理详情页的数据提取,职责清晰,避免逻辑混乱。
  2. 修正CSS选择器:将多类选择器的空格改为.,确保能精准匹配到目标元素。
  3. 优化链接遍历:直接遍历所有球员链接,不会遗漏任何条目。
  4. 调整数据提取时机:只有在详情页的响应返回后,才在parse_player中提取数据,保证数据来源正确。
  5. 清理数据格式:用.strip()去除文本中的多余空白字符,让输出数据更整洁。

内容的提问来源于stack exchange,提问作者TB_4240

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:18:09