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

