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

Python网页爬取全量基金数据时遭遇JSONDecodeError求助

Python网页爬取全量基金数据时遭遇JSONDecodeError求助

嘿,我之前爬取类似分页接口时也碰到过一模一样的问题!这个JSONDecodeError的本质是服务器返回的内容根本不是合法的JSON——大概率是你一次性请求全量67743条数据触发了服务器的限制,或者被反爬机制拦截了,导致服务器返回空内容、错误页面甚至直接断开连接。

下面给你几个排查和解决的实用思路:

1. 服务器大概率限制了单次请求的最大条数

很多网站的后端接口会给length参数设上限,你测试的40000应该就是他们允许的单次最大返回量,超过这个值服务器就不会正常响应了。这种情况最稳妥的解决办法是分页分批请求:

  • 把全量数据拆分成多个小批次,比如每次请求40000条,分两次就能拿完(第一次start=0&length=40000,第二次start=40000&length=27743);或者更保守一点每次请求1000条,循环直到获取完所有数据。
  • 给你改了下代码示例,直接就能用:
import requests
import pandas as pd
import json
import time

# 补全请求头,模拟真实用户访问
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
    "Referer": "https://www.quantalys.com/Recherche"
}

total_funds = 67743
batch_size = 40000  # 用你测试过能成功的数值
all_fund_data = []

for start_idx in range(0, total_funds, batch_size):
    # 计算当前批次的条数,最后一批可能不足batch_size
    current_length = min(batch_size, total_funds - start_idx)
    
    # 构造请求参数,替换start和length
    data = {
        'columns[0][name]': 'ID_Produit',
        'columns[1][name]': 'cTypeFinancialItem',
        # ... 这里直接复制你原来的所有columns参数即可
        'columns[84][name]': 'nESG_Gouvernance',
        'order[0][column]': '5',
        'order[0][dir]': 'asc',
        'start': str(start_idx),
        'length': str(current_length)
    }
    
    try:
        response = requests.post('https://www.quantalys.com/Recherche/Data', headers=headers, data=data)
        response.raise_for_status()  # 检查请求是否成功
        
        batch_data = response.json()['data']
        all_fund_data.extend(batch_data)
        print(f"已获取{len(all_fund_data)}/{total_funds}条数据")
        
        # 加个小延迟,避免请求太频繁触发反爬
        time.sleep(0.5)
    except json.JSONDecodeError:
        print(f"获取批次start={start_idx}时出错,服务器返回内容:{response.text[:300]}")
    except requests.exceptions.RequestException as e:
        print(f"请求失败:{str(e)}")

# 合并所有数据到DataFrame
df_list_fonds = pd.DataFrame(all_fund_data)

2. 检查是否触发了反爬机制

当请求大量数据时,服务器很可能把你识别成爬虫,拒绝返回正常数据。可以试试这些调整:

  • 补全请求头:除了User-Agent,加上Referer(设为网站的搜索页面URL),如果网站需要登录才能看全量数据,还可以把浏览器里的Cookie复制过来。
  • 使用requests.Session()维持会话:先模拟登录(如果有需要),再发起数据请求,保持会话一致性。
  • 增加请求间隔:每次请求后用time.sleep()停顿1-2秒,降低请求频率。

3. 先看服务器到底返回了什么

出现错误时,先打印response.text看看服务器实际返回的内容——是HTML错误页、验证码页面还是空字符串?这能帮你快速定位问题:

response = requests.post(...)
print("服务器返回内容:", response.text)

如果返回的是HTML,那基本是反爬拦截了;如果是空字符串,那肯定是单次请求量超过服务器限制,必须分页。

备注:内容来源于stack exchange,提问作者jacques

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 08:10:32