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

