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

Python爬虫解析Shopify JSON遇JSONDecodeError,仅ruggable.com报错

解决ruggable.com爬取时的JSONDecodeError问题

你遇到的requests.exceptions.JSONDecodeError是因为请求返回的内容不是有效的JSON格式——大概率是ruggable的反爬机制识别到了你的爬虫请求,返回了验证码页面、反爬提示这类HTML内容,而非预期的商品JSON数据。

排查与解决步骤:

  1. 先确认返回内容
    在r = requests.get(url)后添加以下代码,查看网站实际返回的内容:

    print(r.status_code)
    print(r.text[:500])  # 打印前500字符,判断是不是HTML页面
    

    如果返回的是带验证码或反爬提示的HTML,就说明被拦截了。

  2. 完善请求头
    仅靠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"
    }
    
  3. 添加错误处理
    避免程序直接崩溃,添加异常捕获,同时检查响应状态码:

    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()
    
  4. 修改后的完整代码

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:35:16