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

如何使用Python爬取yugiohprices网站指定位置的卡牌价格表格

问题原因

你遇到的是典型的动态页面爬取问题:目标价格表格是页面初始加载完成后,由JavaScript异步请求后端接口数据后才渲染生成的。单纯用requests发送HTTP请求只能拿到初始静态HTML,初始页面本身就不包含你要的价格表格内容,因此不管请求后等待多久都无法通过静态解析拿到数据。


解决方案1:使用Selenium模拟浏览器渲染(易实现)

这种方案直接模拟真实浏览器访问,等页面所有JS执行、内容渲染完成后再解析页面,代码示例如下:

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化Chrome浏览器,需提前安装对应版本的chromedriver
driver = webdriver.Chrome()
url = 'https://yugiohprices.com/card_price?name=Triple+Tactics+Talent'
driver.get(url)

# 显式等待目标表格元素加载,最多等待10秒
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'item_stats'))
    )
    soup = BeautifulSoup(driver.page_source, 'lxml')
    # 获取所有id为item_stats的表格,顶部第一个是 eligibility 表格,后续是各版本价格表
    all_tables = soup.find_all('table', {'id': 'item_stats'})
    
    # 遍历匹配目标MP21-EN143版本对应的表格
    target_table = None
    for table in all_tables:
        version_node = table.find_previous_sibling()
        if version_node and 'MP21-EN143' in version_node.get_text():
            target_table = table
            break
    
    if target_table:
        # 直接解析表格为DataFrame提取平均价格
        price_df = pd.read_html(str(target_table))[0]
        avg_price = price_df.loc[price_df['Stat'] == 'Average Price', 'Value'].iloc[0]
        print(f"2021 Tin of Ancient Battles --MP21-EN143 版本平均价格为:{avg_price}")
    else:
        print("未找到目标版本的价格表格")
finally:
    # 关闭浏览器进程
    driver.quit()

解决方案2:直接调用后端API接口(性能更高)

不需要启动浏览器,直接抓包请求后端数据接口获取结构化的价格数据,效率更高:

import requests

card_name = "Triple Tactics Talent"
# 第一步:请求接口获取卡牌所有版本的元数据
version_url = f"https://yugiohprices.com/api/get_card_versions/{card_name}"
version_res = requests.get(version_url)
version_list = version_res.json()

target_print_tag = None
for version in version_list:
    if 'MP21-EN143' in version['name']:
        target_print_tag = version['print_tag']
        break

if target_print_tag:
    # 第二步:请求对应版本的价格数据接口
    price_url = f"https://yugiohprices.com/api/price_history/{target_print_tag}"
    price_res = requests.get(price_url)
    price_data = price_res.json()
    # 提取平均价格字段
    avg_price = price_data['data']['status']['average']
    print(f"2021 Tin of Ancient Battles --MP21-EN143 版本平均价格为:${avg_price}")
else:
    print("未找到目标版本的卡牌信息")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:15:03