如何使用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
相关产品推荐
相关产品推荐

