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

使用BeautifulSoup爬取eBay时获取到错误的商品价格

问题分析与解决

你遇到的价格不符问题,主要有几个常见原因,对应解决方案如下:

1. 目标元素匹配错误

你当前抓取的s-item__price可能并非页面显示的实际售价,而是原价、促销划线价或者其他价格类型。

解决方法:
打开浏览器开发者工具(F12),定位页面上显示$22.84的价格标签,查看它的真实class属性。比如eBay部分商品的实际售价会放在class="s-item__final-price"的span标签里,而非s-item__price。

修改代码中的元素定位:

# 替换原有的find语句
price_element = soup.find("span", attrs={"class": "s-item__final-price"})
print(price_element.text if price_element else "未找到目标价格元素")

2. 页面内容动态加载

eBay部分商品数据是通过JavaScript动态渲染的,requests只能获取服务器返回的静态HTML,无法获取JS加载后的真实内容。

解决方法:
使用Selenium模拟浏览器行为,获取渲染完成后的页面源码:

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

search_term = 'Ryco Air Filter A1785'
url = f'https://www.ebay.com.au/sch/i.html?_nkw={search_term}'

# 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境变量)
driver = webdriver.Chrome()
driver.get(url)

# 等待价格元素加载完成,超时时间10秒
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 's-item__final-price')))

# 解析渲染后的页面
soup = BeautifulSoup(driver.page_source, 'html.parser')
first_price = soup.find("span", attrs={"class": "s-item__final-price"})
print(first_price.text if first_price else "价格元素未找到")

driver.quit()

3. 请求头与浏览器不一致

requests默认的请求头会被eBay识别为非浏览器请求,可能返回不同的内容(比如不同地区的价格、缓存数据)。

解决方法:
模拟浏览器的请求头发送请求:

from bs4 import BeautifulSoup
import requests

search_term = 'Ryco Air Filter A1785'
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',
    'Accept-Language': 'en-AU,en;q=0.9'
}

response = requests.get(
    'https://www.ebay.com.au/sch/i.html',
    params={'_nkw': search_term},
    headers=headers
)
soup = BeautifulSoup(response.content, 'html.parser')

# 优先查找实际售价元素,找不到再回退到原标签
price = soup.find("span", attrs={"class": "s-item__final-price"}) or soup.find("span", attrs={"class": "s-item__price"})
print(price.text if price else "未找到价格")

注意:eBay的页面结构会定期更新,需随时验证目标元素的class是否有效;频繁爬取可能触发反爬机制,建议控制请求频率并遵守eBay的爬虫规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:22:37