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 }
关键改动说明
- 拆分回调函数:把列表页和详情页的逻辑分开,
parse_list负责列表页的链接遍历和翻页,parse_player专门处理详情页的数据提取,职责清晰,避免逻辑混乱。 - 修正CSS选择器:将多类选择器的空格改为
.,确保能精准匹配到目标元素。 - 优化链接遍历:直接遍历所有球员链接,不会遗漏任何条目。
- 调整数据提取时机:只有在详情页的响应返回后,才在
parse_player中提取数据,保证数据来源正确。 - 清理数据格式:用
.strip()去除文本中的多余空白字符,让输出数据更整洁。
内容的提问来源于stack exchange,提问作者TB_4240
相关产品推荐
相关产品推荐

