如何抓取页面商品信息?及亚马逊商品技术参数表抓取返回空列表问题排查
解决亚马逊商品技术参数抓取返回空列表的问题
首先,我看过你的代码和问题描述,返回空列表大概率是反爬拦截或者页面选择器失效导致的,咱们一步步来排查和解决:
主要问题分析
1. 反爬机制拦截
亚马逊的反爬非常严格,你的请求头和cookies配置太简单了:
- 手动设置的
sessioncookie和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
相关产品推荐
相关产品推荐

