运行速卖通爬虫代码报json.decoder.JSONDecodeError错误如何解决
报错核心原因
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 本质是返回的响应内容不是合法JSON格式,通常是请求被速卖通反爬策略拦截,返回了错误页面、验证码页面或空响应导致的,你的代码存在3个明确问题:
- Cookies全部过期:代码内的Cookies时间戳为2021年的旧数据,速卖通会话Cookies有效期通常不超过24小时,失效后请求会被直接拦截
- Headers参数格式错误:复制请求时携带了多余的转义符
^\^,导致sec-ch-ua、sec-ch-ua-platform等参数格式非法,被反爬识别为异常请求 - 动态参数写死:
pv_feature、_m_h5_tk等参数是每次搜索动态生成的,写死的旧参数无法通过服务端校验
修复步骤
- 打开浏览器访问速卖通对应搜索页面,按F12打开开发者工具,找到
glosearch/api/product接口,复制最新的Cookies、pv_feature参数值替换代码内的旧内容 - 修正Headers参数的转义符,补全
sec-ch-ua完整值 - 增加请求校验逻辑,避免直接调用
json()方法抛出异常
修复后代码示例
import requests import pandas as pd import json # 替换为你刚从浏览器接口中复制的最新Cookies cookies = { # 此处替换为最新Cookies内容 } # 修正格式错误后的Headers headers = { 'authority': 'www.aliexpress.com', 'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"', 'accept': 'application/json, text/plain, */*', 'sec-ch-ua-mobile': '?0', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': 'https://www.aliexpress.com/premium/bags-for-kids-free-shipping.html?trafficChannel=ppc&d=y&CatId=0&SearchText=bags+for+kids+free+shipping<ype=premium&SortType=default&page=2', 'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8,pt;q=0.7', } # 替换为最新的pv_feature参数值 params = ( ('trafficChannel', 'ppc'), ('d', 'y'), ('CatId', '0'), ('SearchText', 'bags for kids free shipping'), ('ltype', 'premium'), ('SortType', 'default'), ('page', '2'), ('origin', 'y'), ('pv_feature', '替换为浏览器中抓取的最新pv_feature值'), ) res = [] r = requests.get('https://www.aliexpress.com/glosearch/api/product', headers=headers, params=params, cookies=cookies) # 新增请求校验逻辑,避免直接报错 if r.status_code == 200: try: data = r.json() if "mods" in data and "itemList" in data["mods"]: for p in data["mods"]["itemList"]["content"]: res.append(p) df = pd.json_normalize(res) df.to_csv('kv.csv', encoding='utf-8-sig') print("数据导出成功") else: print("返回JSON结构异常,内容:", data) except json.JSONDecodeError as e: print("返回内容不是JSON,前500字符为:", r.text[:500]) else: print(f"请求失败,状态码:{r.status_code},响应内容:{r.text[:500]}")
注意事项
- 请求间隔设置为3秒以上,避免高频请求触发IP封禁
- 未登录状态下速卖通仅开放前3页搜索数据,超过3页需要登录后更新Cookies
- 如果返回验证码页面,先在浏览器中完成验证码校验,再更新Cookies重新请求
内容的提问来源于stack exchange,提问作者Arslan Aziz
相关产品推荐
相关产品推荐

