Python爬虫解析Shopify JSON遇JSONDecodeError,仅ruggable.com报错
解决ruggable.com爬取时的JSONDecodeError问题
你遇到的requests.exceptions.JSONDecodeError是因为请求返回的内容不是有效的JSON格式——大概率是ruggable的反爬机制识别到了你的爬虫请求,返回了验证码页面、反爬提示这类HTML内容,而非预期的商品JSON数据。
排查与解决步骤:
先确认返回内容
在r = requests.get(url)后添加以下代码,查看网站实际返回的内容:print(r.status_code) print(r.text[:500]) # 打印前500字符,判断是不是HTML页面如果返回的是带验证码或反爬提示的HTML,就说明被拦截了。
完善请求头
仅靠User-Agent不够,需要模拟更真实的浏览器请求头,比如添加Accept、Referer、Accept-Language等字段,甚至可以从浏览器复制真实的请求头(F12→网络→复制请求头)。修改后的headers示例:headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36", "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Referer": "https://ruggable.com/collections/premium-medium-pile-rugs", "X-Requested-With": "XMLHttpRequest" }添加错误处理
避免程序直接崩溃,添加异常捕获,同时检查响应状态码:r = requests.get(url, headers=headers) if r.status_code != 200: print(f"请求失败,状态码:{r.status_code}") print(r.text) exit() try: data = r.json() except json.JSONDecodeError: print("返回内容不是JSON,可能被反爬拦截") print(r.text[:1000]) exit()修改后的完整代码
import requests import json import pandas as pd url = 'https://ruggable.com/collections/premium-medium-pile-rugs/products.json?limit=250&page=1' headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36", "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Referer": "https://ruggable.com/collections/premium-medium-pile-rugs", "X-Requested-With": "XMLHttpRequest" } r = requests.get(url, headers=headers) product_list = [] # 检查请求状态与返回格式 if r.status_code != 200: print(f"请求失败,状态码:{r.status_code}") print(r.text[:1000]) else: try: data = r.json() for item in data['products']: title = item['title'] print(title) for variant in item['variants']: # 注意:部分variant可能没有option2,需要做容错处理 color = variant.get('option1', '无颜色') size = variant.get('option2', '无尺寸') img = variant.get('featured_image', {}).get('src', '无图片') product = { 'title': title, 'color': color, 'size': size, 'image': img } product_list.append(product) # 移到循环外,避免重复创建DataFrame df = pd.DataFrame(product_list) df.to_csv('rugable.csv', index=False) print('保存成功') except json.JSONDecodeError: print("返回内容不是有效JSON,可能被反爬拦截") print(r.text[:1000])
额外提示:
- 如果还是被拦截,可以尝试添加
Cookie字段(从浏览器登录ruggable后复制),或者使用requests.Session()维持会话。 - 注意爬取频率,不要过快请求,避免触发更严格的反爬。
内容的提问来源于stack exchange,提问作者babar akhter
相关产品推荐
相关产品推荐

