Python使用BeautifulSoup爬取Mavin.io球星卡估值时h4返回None求助
核心问题点与修复方案
- 动态渲染导致静态请求拿不到目标节点
用requests请求拿到的是服务器返回的初始静态HTML,目标绿色估值框是页面加载完成后,由前端JS发起接口请求、拿到估值数据再插入到DOM中的,静态返回的HTML里本身就不存在estimate-box equal-width类名的div,所以soup.find()自然会返回None。 - URL拼接逻辑存在致命bug
基础搜索URL被定义在循环外部,每一次搜索请求完成后,URL都会保留上一次拼接的关键词内容,下一次搜索时直接在已有的畸形URL上继续追加新的搜索词,最终生成的搜索地址完全不符合站点路由规则,根本请求不到正确的搜索结果页。 - 默认请求配置触发站点反爬
requests不带自定义请求头时,会默认携带python-requests/xxx的UA标识,站点识别到爬虫请求后会返回验证拦截页,返回的HTML中自然不存在目标业务节点。
修复后的可运行代码
from bs4 import BeautifulSoup import requests # 抽离基础地址为常量,避免循环内的URL累加问题 BASE_SEARCH_URL = 'https://mavin.io/search?q=' # 配置模拟真实浏览器的请求头,规避反爬拦截 REQUEST_HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } print('\t 想知道你的棒球球星卡价值?') print('在下方输入球员姓名和球星卡编号即可查询') print('输入"STOP"作为球员名即可退出程序') print('----------------------------------------------------------------------------') running = True while running: player_name = input('球员姓名:').lower().strip() card_no = input('球星卡编号:').strip() # 校验输入:球员姓名不能包含数字 if any(char.isdigit() for char in player_name): print() print('-----------------------------') print('输入格式错误!球员姓名不能包含数字') print('-----------------------------') continue if player_name == 'stop': running = False print() print('--------------------------------------------') print('感谢使用,下次再见') print('--------------------------------------------') break # 每次请求都重新基于基础地址拼接,避免URL累加畸形 current_search_url = BASE_SEARCH_URL name_segments = player_name.split(' ') for seg in name_segments: current_search_url += f"{seg}+" current_search_url += card_no # 发起带请求头的请求 resp = requests.get(current_search_url, headers=REQUEST_HEADERS) soup = BeautifulSoup(resp.text, 'lxml') target_box = soup.find('div', class_='estimate-box equal-width') if target_box: price = target_box.find('h4').text.strip() print(f'该球星卡当前估值:{price}') else: print('暂未获取到该球星卡的有效估值数据')
动态渲染场景的补充说明
如果完成以上修改后,还是无法找到目标节点,说明估值区块完全依赖前端JS渲染生成,静态DOM爬取的方案已经不适用,可选择两个稳定修复方向:
- 替换为Playwright这类支持真实浏览器渲染的工具,等待页面加载完成、DOM节点完全生成后再提取数据
- 打开浏览器开发者工具的网络面板,定位估值数据的XHR返回接口,直接请求该接口获取结构化的JSON数据,稳定性远高于DOM爬取
内容的提问来源于stack exchange,提问作者bkukan13
相关产品推荐
相关产品推荐

