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

如何抓取页面商品信息?及亚马逊商品技术参数表抓取返回空列表问题排查

解决亚马逊商品技术参数抓取返回空列表的问题

首先,我看过你的代码和问题描述,返回空列表大概率是反爬拦截或者页面选择器失效导致的,咱们一步步来排查和解决:

主要问题分析

1. 反爬机制拦截

亚马逊的反爬非常严格,你的请求头和cookies配置太简单了:

  • 手动设置的session cookie和headers里的session字段大概率是无效的,亚马逊能识别出这不是真实浏览器的请求
  • 缺少关键请求头字段(比如Accept、Accept-Language、Referer),这些字段能让请求更贴近真实浏览器行为

2. 页面选择器可能失效

你依赖的productDetails_techSpec_section_1这个ID不是所有商品页面通用的,有些商品的技术参数表格可能用了不同的ID或者class,比如部分页面的参数表class是a-keyvalue prodDetTable,而非固定ID。

3. 缺少错误排查日志

你的try-except直接continue,完全不知道是请求失败还是找不到元素,很难定位具体问题。

修正后的解决方案

步骤1:完善请求头和会话管理

不要手动编写cookies,改用requests.Session()维持会话,同时复制真实浏览器的请求头(可以从Chrome开发者工具的Network面板里直接复制)。

步骤2:调整参数表选择器

用更通用的方式定位技术参数表格,比如先找所有包含技术参数的表格,再提取内容,避免依赖固定ID。

步骤3:添加错误排查逻辑

在异常处理里打印错误信息,方便快速定位问题。

修正后的代码

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import time

# 初始化会话,自动维持cookie
session = requests.Session()
# 替换成你自己浏览器的请求头(从开发者工具复制)
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,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://www.amazon.com/',
    'Upgrade-Insecure-Requests': '1',
}
session.headers.update(headers)

base_url = 'https://www.amazon.com'
productlinks = []
results = []

# 获取商品列表链接
try:
    r = session.get('https://www.amazon.com/s?rh=n%3A1069242&fs=true&ref=lp_1069242_sar')
    r.raise_for_status()  # 检查请求是否成功
    soup = BeautifulSoup(r.content, 'lxml')
    for link in soup.find_all('a', class_="a-link-normal s-underline-text s-underline-link-text a-text-normal", href=True):
        p = link['href']
        l = urljoin(base_url, p)
        productlinks.append(l)
    print(f"成功获取 {len(productlinks)} 个商品链接")
except Exception as e:
    print(f"获取商品列表失败: {str(e)}")

# 遍历商品链接抓取参数
for idx, link in enumerate(productlinks):
    print(f"正在抓取第 {idx+1} 个商品: {link}")
    try:
        r = session.get(link)
        r.raise_for_status()
        soup = BeautifulSoup(r.content, 'lxml')
        
        # 检查是否遇到验证码拦截
        if "captcha" in soup.text.lower() or "robot check" in soup.text.lower():
            print("⚠️ 遇到反爬拦截,请更换IP或等待一段时间后再试")
            continue
        
        # 用通用方式匹配技术参数表格
        tech_tables = soup.find_all('table', class_='a-keyvalue prodDetTable')
        if not tech_tables:
            # 备用匹配:找ID包含techSpec的表格
            tech_tables = soup.find_all('table', id=lambda x: x and 'techSpec' in x)
        
        for table in tech_tables:
            for tr in table.find_all('tr'):
                row_text = tr.text.strip()
                if row_text:  # 过滤空行
                    results.append(row_text)
                    print(row_text)
        
        # 添加请求间隔,避免被封
        time.sleep(2)
        
    except Exception as e:
        print(f"抓取商品 {link} 失败: {str(e)}")
        continue

print("\n最终抓取到的参数内容:")
print(results)

额外注意事项

  • 请求频率控制:亚马逊会限制频繁请求,建议在每个请求之间添加time.sleep(2-3),避免IP被封禁
  • 遵守爬取规则:请确保你的爬取行为符合亚马逊的robots.txt和服务条款,不要用于商业用途
  • 动态内容处理:如果遇到完全动态加载的参数表,可能需要用selenium或playwright模拟浏览器渲染,但这会增加被反爬的风险

内容的提问来源于stack exchange,提问作者GX Mentor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:19:07