亚马逊笔记本商品价格爬取顺序与页面不一致问题排查求助
亚马逊笔记本商品价格爬取顺序与页面不一致问题排查求助
嗨,我来帮你分析下这个爬取顺序混乱的问题,大概率是商品容器选择器不准确导致的,咱们一步步拆解来看:
问题根源分析
你当前用的boxs = soup.find_all("div", class_="puisg-col puisg-col-4-of-12 ...")这个选择器,选中的是商品卡片里的右侧列元素,而非整个商品卡片本身。亚马逊的页面用网格布局(Grid)渲染商品,HTML里这些列元素的顺序,和你视觉上从上到下、从左到右的商品展示顺序并不匹配,自然爬出来的价格顺序就乱了。
而且这类布局相关的class命名非常不稳定,亚马逊随时可能调整布局类名,很容易导致漏爬或多选。
解决办法:换用精准的商品容器选择器
亚马逊的每个搜索结果商品项,都会带有data-component-type="s-search-result"这个专属标记属性,用它定位整个商品卡片,能严格保证爬取顺序和页面展示顺序完全一致。
修改后的代码如下:
import requests from bs4 import BeautifulSoup URL = "https://www.amazon.com/s?k=laptop&crid=288NMI7Z5E2WR&sprefix=laptop%2Caps%2C572&ref=nb_sb_noss_1" header = { "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": "hr-HR,hr;q=0.9,en-US;q=0.8,en;q=0.7" } response = requests.get(URL, headers=header) web_page = response.text soup = BeautifulSoup(web_page, 'lxml') # 用亚马逊官方标记的搜索结果项作为容器,顺序完全匹配页面展示 items = soup.find_all("div", {"data-component-type": "s-search-result"}) for item in items: try: name = item.find("span", class_="a-size-medium a-color-base a-text-normal").get_text(strip=True) price = item.find("span", class_="a-offscreen").get_text(strip=True) print(f"{name} - {price}") except AttributeError: # 处理特殊情况:比如部分商品缺货无价格、或名称元素不存在 continue
额外优化说明
- 增加
try-except异常捕获:避免遇到缺货商品(无价格)或特殊商品(无名称元素)时直接报错终止程序。 - 用
get_text(strip=True)替代getText():自动去除文本前后的空格和换行,输出更整洁。
验证小技巧
你可以先打印len(items),看看和页面上实际显示的商品数量是否一致(正常亚马逊第一页是16-24个商品),如果数量对得上,那爬取的顺序就没问题啦~
备注:内容来源于stack exchange,提问作者SolidOpt
相关产品推荐
相关产品推荐

