Python亚马逊价格爬虫本地运行正常 Ubuntu服务器报AttributeError
故障原因排查与解决方法
核心错误根因
你遇到的AttributeError: 'NoneType' object has no attribute 'get_text'错误,本质是soup.find(id='priceblock_ourprice')没有匹配到对应元素,返回了空值None,后续调用get_text方法自然触发异常。本地运行正常、服务器运行失败,大概率是以下几个原因导致:
- 亚马逊反爬机制拦截:服务器IP普遍被亚马逊标记为爬虫风险IP,请求返回的不是正常商品详情页,而是验证码页、地区选择页或者登录拦截页,页面内不存在
priceblock_ourprice元素 - 请求头配置异常:服务器上的请求头
headers参数配置不全,比如使用了requests默认的User-Agent,缺少正常浏览器的Accept、Cookie等字段,直接被亚马逊识别为爬虫拦截 - 站点元素规则差异:服务器出口IP对应亚马逊站点和本地访问的站点不同,或者亚马逊前端已更新元素规则,
priceblock_ourprice是旧版元素ID,新版页面已改用其他选择器
具体解决步骤
1. 先确认返回页面实际内容
在请求发送后新增调试代码,把服务器拿到的页面内容存成本地文件,确认是否是正常商品页:
page = requests.get(URL, headers=headers) # 新增调试代码 with open('debug_page.html', 'wb') as f: f.write(page.content)
把生成的debug_page.html下载到本地打开,就能直观看到请求是否被拦截、页面元素是否有变动。
2. 完善请求头配置
替换headers为真实浏览器的请求参数,至少要包含真实的User-Agent、Accept、Accept-Language字段,必要时可以复制本地浏览器访问亚马逊时携带的Cookie到请求头中:
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,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate, br" }
3. 兼容元素匹配逻辑,避免直接崩溃
不要直接调用get_text,先判断元素是否存在,同时新增新版亚马逊价格元素的匹配规则:
# 替换原有的title获取逻辑 price_elem = soup.find(id='priceblock_ourprice') # 兼容新版亚马逊价格元素选择器 if not price_elem: price_elem = soup.find('span', class_='a-price-whole') # 元素不存在时发告警通知,避免脚本直接崩溃 if not price_elem: send_msg('无法获取商品价格,请求可能被反爬拦截或页面规则已更新') return title = price_elem.get_text()
4. 修复隐藏的文件写入bug
你当前代码中使用r+模式读写data.txt存在逻辑问题:f.read()后文件指针会移动到末尾,直接调用f.write()会把新价格追加到原有内容之后,下次读取时转float会报错。可以调整为以下逻辑:
if os.path.exists('data.txt'): with open('data.txt', 'r') as f: f_contents = f.read().strip() if converted_price != float(f_contents): send_msg(f'The price was updated to: {converted_price}€') # 直接用w模式覆盖写入,避免追加问题 with open('data.txt', 'w') as f: f.write(str(converted_price))
内容的提问来源于stack exchange,提问作者Error042
相关产品推荐
相关产品推荐

