Python新手使用requests+bs4爬取FUTBIN球员页无返回结果问题
故障原因
- 代码存在低级输入错误:定位元素的class属性值里混入了编辑器自动补全带进来的
enter code here冗余内容,会直接导致元素匹配失败,目标元素的正确class值为player_name_players_table get-tp。 - FUTBIN配置了基础反爬规则,
requests默认的请求头会被站点识别为爬虫脚本,直接拦截请求,不会返回浏览器端看到的正常球员列表页面。这也是同逻辑爬取IMDB正常、爬FUTBIN失效的核心差异——IMDB未对默认请求头做拦截校验。 - 额外注意:FUTBIN的球员列表为异步加载,初始请求返回的HTML源码中不会直接嵌入完整的球员表格数据,页面渲染完成后才会通过后台接口拉取全量球员信息填充到表格中。
修正方案
首先补全真实的浏览器请求头绕过基础反爬,同时修正元素选择器的输入错误,参考代码如下:
import requests from bs4 import BeautifulSoup # 请求头里的User-Agent替换为你自己浏览器的对应值即可 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" } resp = requests.get("https://www.futbin.com/players", headers=headers) resp.encoding = resp.apparent_encoding soup = BeautifulSoup(resp.text, features="html.parser") # 注意球员链接是多个,用find_all批量获取,修正class参数的冗余内容 player_links = soup.find_all("a", class_="player_name_players_table get-tp") for link in player_links: print(link.text.strip(), link.get("href"))
如果上述代码依然拿不到完整球员数据,直接打开浏览器开发者工具的「网络」面板,筛选XHR请求找到拉取球员列表的后台接口,直接请求接口拿结构化的JSON数据即可,解析效率比爬HTML高很多,也不容易受页面结构变动影响。
内容的提问来源于stack exchange,提问作者Tahsin Wahid
相关产品推荐
相关产品推荐

