使用Python的Beautiful Soup无法获取亚马逊商品价格的问题
解决亚马逊商品价格爬取时遇到的reCAPTCHA问题
你碰到的确实是亚马逊的reCAPTCHA反爬机制在起作用——当亚马逊检测到请求不像正常浏览器发出的,哪怕你加了请求头,也会返回验证页面。这时候你爬取到的内容根本不是商品详情页,自然找不到a-price-whole标签,输出的6位数字大概率是验证页面里的无关内容。
给你几个可行的解决方向:
- 补全请求头信息:只加User-Agent和Accept-Language还不够,多添加几个浏览器常用的头信息,模拟更真实的请求。比如:
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-Language": "en-US,en;q=0.9", "Referer": "https://www.amazon.in/", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive" }
别用environ.get()获取UA,除非你能确定环境变量里的UA是最新有效的,直接写一个当前可用的UA更靠谱。
控制请求频率:短时间内多次请求会触发亚马逊的反爬,在每次请求之间加个延迟,比如用
time.sleep(2)让请求间隔2秒。用会话保持请求连贯性:用
requests.Session()维持会话,模拟浏览器的Cookie持久化,让请求看起来更像正常用户操作:
import time session = requests.Session() session.headers.update(headers) time.sleep(2) response = session.get(amazon_link_address)
先确认返回的页面内容:在解析前先打印
response.text[:500],看看返回的是商品页面还是验证页面。如果是验证页面,就得调整反爬规避策略。修正代码里的错误:你现在代码里
soup = BeautifulSoup(response.content, features="lxml").prettify()这步错了——prettify()会把BeautifulSoup对象转成字符串,之后调用find()是在字符串上操作,肯定找不到标签。得去掉.prettify(),而且a-price-whole是span标签,最好明确指定:
soup = BeautifulSoup(response.content, features="lxml") price_element = soup.find("span", class_="a-price-whole") print(price_element.text.strip() if price_element else "没找到价格标签")
内容的提问来源于stack exchange,提问作者JR. JOE
相关产品推荐
相关产品推荐

