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

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爬取的方案已经不适用,可选择两个稳定修复方向:

  1. 替换为Playwright这类支持真实浏览器渲染的工具,等待页面加载完成、DOM节点完全生成后再提取数据
  2. 打开浏览器开发者工具的网络面板,定位估值数据的XHR返回接口,直接请求该接口获取结构化的JSON数据,稳定性远高于DOM爬取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 02:45:04