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

使用BeautifulSoup爬取亚马逊头盔数据返回空列表如何解决

亚马逊男士头盔数据爬取问题修复方案

核心问题原因

你用requests直接发起请求时未携带浏览器身份标识,亚马逊反爬机制会直接识别为爬虫请求,返回的是拦截验证页面而非正常商品列表页,所以解析元素时拿到空列表,和你的元素定位方法无关。

可行修改步骤

  • 添加请求头模拟真实浏览器,核心是携带User-Agent参数,你可以打开Brave浏览器的F12开发者工具,在任意请求的请求头里复制自己浏览器的UA,也可以先用通用测试UA
  • 增加请求状态校验,确认接口返回200后再解析内容
  • 增加请求间隔,避免短时间高频请求触发IP封禁
  • 元素定位可以保留原有逻辑,也可以用CSS选择器简化写法

修复后代码示例

from bs4 import BeautifulSoup
import requests
import time

# 替换成你自己Brave浏览器的User-Agent,识别成功率更高
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/avif,image/webp,image/apng,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}

for n in range(1,15):
    url = f"https://www.amazon.in/s?k=helmets+for+men&i=automotive&rh=n%3A4772060031%2Cp_89%3ASteelbird%7CStudds%7CVega%2Cp_36%3A150000-200000&dc&page={n}&qid=1629448200&rnid=5814682031&ref=sr_pg_{n}"
    page = requests.get(url, headers=headers)
    # 校验请求是否成功
    if page.status_code != 200:
        print(f"第{n}页请求失败,状态码:{page.status_code}")
        time.sleep(5)
        continue
    soup = BeautifulSoup(page.content, 'lxml')
    # 两种定位方式选一种即可
    # 方式1:原有类名定位
    for title in soup.find_all('span', attrs = {'class' : ['a-size-base-plus', 'a-color-base', 'a-text-normal']}):
        print(title.get_text(strip=True))
    # 方式2:CSS选择器定位
    # for title in soup.select('span.a-size-base-plus.a-color-base.a-text-normal'):
    #     print(title.get_text(strip=True))
    # 每次请求后休眠3秒
    time.sleep(3)

补充注意事项

如果添加请求头后依然触发验证码拦截,可以改用Selenium、Playwright等自动化工具模拟真实浏览器操作,或者搭配代理IP使用,降低被反爬拦截的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:09:04