Python爬取Futbin市场涨幅榜时出现AttributeError问题
解决Futbin市场Top Gainers爬取的AttributeError问题
错误根源
AttributeError: 'NoneType' object has no attribute 'find' 说明soup.find("div", id="24_hours_movers")返回了None——也就是没找到目标ID的元素,主要原因有两个:
- 网站拦截了无身份标识的爬虫请求(你的
requests.get未携带任何请求头,被识别为非浏览器访问) - 页面结构已更新,目标元素的ID或类名发生了变化
修复方案
1. 添加请求头模拟浏览器访问
给requests.get加上User-Agent头,避免被反爬拦截:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(URL, headers=headers)
2. 确认并修正元素选择器
如果添加头信息后仍找不到元素,需重新核对页面结构:
- 打开Futbin市场页面,右键"检查"查看Market Movers板块的实际HTML结构
- 确认Top Gainers所在容器的正确ID或类名(比如当前页面中目标容器ID可能已变更,需以实际页面为准)
3. 修复代码变量名错误
原代码最后一行的card_holders_div是未定义变量,应改为card_holder_divs(与上一行变量名保持一致)
修改后的完整代码示例
import requests from bs4 import BeautifulSoup URL = "https://www.futbin.com/market/" WEBHOOK_URLS = [ "x", "x" ] # 添加请求头模拟浏览器 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(URL, headers=headers) response.raise_for_status() # 主动抛出请求错误,方便排查问题 soup = BeautifulSoup(response.content, "html.parser") # 分步查找,避免链式调用直接报错 movers_container = soup.find("div", id="24_hours_movers") if not movers_container: print("未找到24_hours_movers容器,请检查页面结构或请求头") else: top_gainers_div = movers_container.find("div", class_="col-md-6") if top_gainers_div: card_holder_divs = top_gainers_div.find_all("div", class_="d-inline") # 修复变量名错误,收集所有卡片容器 card_holders = [] for div in card_holder_divs: holders = div.find_all("div", class_="d-inline mx-2") card_holders.extend(holders) print(f"找到{len(card_holders)}个Top Gainers卡片") else: print("未找到Top Gainers所在的col-md-6容器")
额外提示
- 如果页面是动态加载(比如Market Movers数据通过JS渲染),单纯用
requests+BeautifulSoup可能无法获取内容,这时需要改用selenium或playwright模拟浏览器加载页面 - 爬取前请遵守网站
robots.txt规则,避免过度请求导致IP被封禁
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

