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

Python使用requests爬取带动态query参数的JSON分页站点求助

处理动态JSON分页站点的实操方案

1. 解析queryString参数生成逻辑

你看到的动态变化的queryString参数,本质是URL编码后的JSON查询配置对象,将现有参数解码后可以得到固定结构:

{
  "areaId": "2ED88F27-93E9-4743-B746-ECEAB5DFED08",
  "isQuery": false,
  "sortAttribute": null,
  "sortDirection": null,
  "pageno": "1",
  "perPage": "12",
  "values": [],
  "productIds": [],
  "partnerId": null,
  "options": [null,null,null]
}

分页时只需要修改JSON中的pageno字段,再重新做URL编码,就能生成对应页码的合法queryString参数,不需要硬拼接可变参数。

2. 核心爬取代码实现

import requests
import json
import time
from urllib.parse import quote

# 固定查询模板,除pageno外其余参数不需要修改
query_template = {
    "areaId": "2ED88F27-93E9-4743-B746-ECEAB5DFED08",
    "isQuery": False,
    "sortAttribute": None,
    "sortDirection": None,
    "pageno": "1",
    "perPage": "12",
    "values": [],
    "productIds": [],
    "partnerId": None,
    "options": [None, None, None]
}
base_url = "https://www.arp.fr/produits-portables-tablettes-ordinateurs-portables/"
# 伪装浏览器请求头,避免被反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "Accept": "application/json, text/javascript, */*; q=0.01"
}

# 分页循环,可自行调整最大页码,或判断返回产品为空时自动终止
for page_num in range(1, 21):
    # 更新当前页码
    query_template["pageno"] = str(page_num)
    # 将JSON对象转字符串后做URL编码,生成queryString参数
    encoded_query = quote(json.dumps(query_template, separators=(',', ':')))
    # 构造完整请求参数
    req_params = {
        "queryString": encoded_query,
        "page": page_num,
        "productfilter": "",
        "sort": "null"
    }
    # 发送请求
    resp = requests.get(base_url, params=req_params, headers=headers)
    # 请求失败直接跳过当前页,也可自行增加重试逻辑
    if resp.status_code != 200:
        time.sleep(2)
        continue
    # 解析返回JSON数据
    page_data = resp.json()
    # 需根据实际返回JSON结构调整产品列表的取值路径,首次运行可打印page_data确认结构
    product_list = page_data.get("products", [])
    if not product_list:
        # 无产品数据时终止分页循环
        break
    
    # 提取目标字段
    for item in product_list:
        result = {
            "Product_Name": item.get("name", ""),
            # 站点返回的产品路径为相对路径,拼接主域名得到完整链接
            "ProductUrl": f"https://www.arp.fr{item.get('url', '')}",
            "ProductDescription": item.get("description", "")
        }
        # 此处可替换为写入CSV/数据库的存储逻辑
        print(result)
    # 请求间隔1-2秒,避免触发频率限制
    time.sleep(1.5)

3. 注意事项

  • 首次运行可先打印完整的resp.json()返回结果,确认产品列表对应的JSON键名,部分站点可能把产品数据放在data.productList等二级/三级字段下
  • 若遇到反爬拦截,可增加代理IP、Cookie轮换等逻辑,不要高频无间隔请求

内容的提问来源于stack exchange,提问作者Mandar Raut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:42:00