使用Requests与XPath爬取亚马逊多卖家价格遇到的技术问题
解决亚马逊多卖家价格爬取问题
Got it, let's break down why you're struggling to get those other seller prices and fix it step by step.
核心问题分析
亚马逊的「New (x) from」卖家信息区域是动态加载的——它不会出现在requests.get()返回的初始HTML响应里。你原本的代码试图定位还未渲染的元素,所以XPath自然返回空值。另外你的代码还有几个小bug(比如没用到传入的URL参数、XPath里的转义引号错误)也加剧了问题。
修正方案
下面是修改后的代码,能处理动态内容并正确定位目标元素:
from requests_html import HTMLSession def GetPrice(URL): s = HTMLSession() # 模拟真实浏览器的User-Agent,避免被亚马逊识别为爬虫拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } r = s.get(URL, headers=headers) # 用无头浏览器渲染页面,加载动态内容 # 设置5秒等待时间,给卖家区域足够的加载时长 r.html.render(sleep=5) # 用灵活的XPath匹配所有卖家价格(匹配ID以"aod-price-"开头的元素) seller_prices = r.html.xpath('//div[contains(@id, "aod-price-")]/span/span[2]/text()') # 同时获取页面默认显示的价格做对比 default_price = r.html.xpath('//span[@class="a-price-whole"]/text()') default_price = default_price[0] if default_price else "无法获取默认价格" product = { 'default_price': default_price, 'other_seller_prices': seller_prices } print(product) return product # 测试你的目标URL GetPrice('https://www.amazon.co.uk/Colgate-Fresh-Cooling-Crystals-Toothpaste/dp/B073V1MB17/ref=sr_1_5_mod_primary_new?dchild=1&keywords=Toothpaste&qid=1625698678&rdc=1&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=8-5')
关键改进点
- 动态内容处理:
r.html.render()方法会启动无头Chromium浏览器,像真实用户浏览一样渲染页面,从而加载出隐藏的卖家信息区域。sleep=5是给页面预留足够的动态数据加载时间。 - 灵活的XPath:不再硬编码特定ID(比如
aod-price-1),而是用contains(@id, "aod-price-")匹配所有卖家价格元素,适配多个卖家的场景。 - 反拦截措施:添加真实的User-Agent请求头,降低被亚马逊识别为爬虫的概率。
- Bug修复:代码现在使用传入的
URL参数而非全局变量,同时修复了XPath里的转义引号问题。
额外注意事项
- 亚马逊会频繁调整页面结构,你可能需要定期用浏览器开发者工具(F12)检查卖家价格元素,更新XPath。
- 避免过于频繁的爬取操作——可以在请求之间添加延迟,或者使用代理,防止IP被封禁。
- 如果调用
render()时出错,按照提示安装Chromium即可(requests-html会给出具体安装命令)。
内容的提问来源于stack exchange,提问作者Meh.
相关产品推荐
相关产品推荐

