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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:45:02