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

使用lxml html模块与XPath爬取亚马逊热销数据无输出,求原因

为什么用Requests+lxml爬亚马逊热销榜返回空列表?

核心原因

  • 动态内容未渲染:亚马逊热销榜的部分内容是通过JavaScript动态生成的。Selenium的ChromeDriver会模拟完整浏览器环境,执行页面JS后获取渲染完成的HTML;而Requests直接拿到的是服务器返回的原始静态HTML,没有JS生成的内容,自然找不到目标元素。
  • 动态ID不可靠:你XPath中使用的CardInstancekNA5iTRPgXKDudcFAO3j3Q是亚马逊动态生成的元素ID,每次请求页面这个ID都会变化,硬编码的XPath肯定匹配不到任何元素。
  • 反爬机制拦截:亚马逊对非浏览器的HTTP请求有反爬策略,Requests默认的请求头过于简单,会被识别为爬虫,返回的页面内容可能被截断或篡改,导致无法定位目标元素。

解决方案

方案1:优化Requests+lxml的实现

  • 模拟浏览器请求头,避免被反爬识别;
  • 使用稳定的元素选择器(比如和BeautifulSoup一致的类名,而非动态ID)。

示例代码:

import requests
from lxml import html

# 模拟Chrome浏览器的请求头
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': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}

# 发送请求
page = requests.get(
    'https://www.amazon.com/Best-Sellers-Computers-Accessories/zgbs/pc/ref=zg_bs_pg_1?_encoding=UTF8&pg=1',
    headers=headers
)
tree = html.fromstring(page.content)

# 用稳定的类名定位,和BeautifulSoup逻辑对齐
product_links = tree.xpath('//div[@class="p13n-desktop-grid"]//div[@id="gridItemRoot"]//a[@tabindex="-1"]')
for link in product_links:
    print(link.get('href'))

方案2:继续使用Selenium

如果页面动态内容较多、反爬严格,Selenium的浏览器模拟方式更省心,它会自动处理JS渲染和浏览器环境验证,不需要手动构造复杂的请求头或处理动态内容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:45:38