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

Django开发亚马逊数据爬虫页面偶发无数据输出问题排查

问题排查与修复方案
  • 核心问题是你定义了requests.Session但未实际使用,提前设置的UA、语言请求头全部未生效,亚马逊反爬策略会随机拦截无有效请求头的请求,返回验证页面或空内容,导致解析不到商品数据,这是时好时坏的根因
  • 请求逻辑存在漏洞:未校验请求状态码、未处理搜索参数为空的场景、解析逻辑写在GET判断外,若请求失败导致soup未定义会直接报错,同时仅对价格加了异常捕获,标题、图片解析失败也会导致整个请求异常
  • 视图参数命名不符合规范(Django惯例用request作为视图第一个参数,你写的response易引发逻辑混淆)
  • 未对返回内容做校验,若亚马逊返回验证码拦截页,无对应商品类名元素会直接返回空列表
修复后的代码

views.py

import requests
from bs4 import BeautifulSoup
from django.shortcuts import render

def amzlogic(request):
    # 建议更新为较新的UA,旧UA被拦截概率更高
    USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    LANGUAGE = "en-US,en;q=0.5"
    session = requests.Session()
    session.headers['User-Agent'] = USER_AGENT
    session.headers['Accept-Language'] = LANGUAGE
    session.headers['Content-Language'] = LANGUAGE
    title_list = []
    price_list = []
    image_url_list = []
    
    # 只有带搜索参数的GET请求才执行爬取,避免首次加载页面时报错
    if request.method == "GET" and request.GET.get("search-item"):
        search = request.GET.get("search-item").strip()
        search = search.replace(" ", "+")
        url = f"https://www.amazon.in/s?k={search}&page=1"
        
        try:
            # 用提前配置好header的session发起请求,加超时避免服务挂死
            page = session.get(url, timeout=10)
            # 校验HTTP请求是否成功
            page.raise_for_status()
            soup = BeautifulSoup(page.content,'lxml')
            
            for item in soup.select(".s-border-top"):
                try:
                    title = item.select_one(".a-color-base.a-text-normal").get_text()[:25]
                except:
                    title = "无商品标题"
                try:
                    price = item.select_one(".a-price-whole").get_text().replace(",", "").replace(".", "")
                except:
                    price = "暂无报价"
                try:
                    image_url = item.select_one(".s-image").get('src')
                except:
                    image_url = ""
                
                title_list.append(title)
                price_list.append(price)
                image_url_list.append(image_url)
        except Exception as e:
            # 生产环境建议替换为Django日志模块,方便排查问题
            print(f"爬取出错:{e}")

    return render(request, "main/amazonscrape.html", {
        "title_list":title_list, 
        "price_list":price_list, 
        "image_list":image_url_list
    })

模板优化(可选)

在原有表格代码前增加空数据提示,提升用户体验:

{% if title_list %}
<!-- 此处保留你原有的表格代码 -->
<table>
    <!-- 原有表格内容 -->
</table>
{% else %}
<p>暂无搜索结果,可能是搜索词无效或被亚马逊反爬拦截,请稍后重试</p>
{% endif %}
额外注意事项
  • 亚马逊反爬策略严格,如果频繁请求依然会被拦截,后续可通过增加UA池、代理IP、随机请求间隔来提升爬取成功率
  • 如果还是频繁出现空数据,可打印page.text查看返回内容,确认是否被验证码拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:04