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

