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

Shopify订单API多页数据获取问题求助

解决Shopify API多页订单获取问题

问题分析

你的代码存在几个核心问题,导致无法获取多页订单数据:

  • URL格式错误:使用了HTML转义字符&而非实际的&,且f-string变量替换写法错误(%7Bpage_info%7D无法正确替换变量,应直接用{变量名})
  • 误解Shopify分页机制:Shopify API分页不是手动指定页码,而是通过响应头的Link字段获取下一页的page_info参数
  • 仅发起单次请求:没有循环遍历所有分页,自然只能拿到单页数据

修正后的代码

import requests
import pandas as pd
from datetime import datetime, timedelta
import re

# 配置信息
api_token = 'MYTOKEN'
store_name = 'MYSTORE'
api_version = '2020-04'

# 日期范围:获取昨天的全部订单
today = datetime.now()
yesterday = today - timedelta(days=1)
start_date = yesterday.strftime('%Y-%m-%dT00:00:00Z')
end_date = yesterday.strftime('%Y-%m-%dT23:59:59Z')

# 初始化变量
all_orders = []
limit = 250  # Shopify API单页最大返回数,减少请求次数
next_page_url = None

# 基础请求配置
base_url = f'https://{store_name}.myshopify.com/admin/api/{api_version}/orders.json'
initial_params = {
    'limit': limit,
    'created_at_min': start_date,
    'created_at_max': end_date
}
headers = {'X-Shopify-Access-Token': api_token}

# 循环获取所有分页数据
while True:
    # 发起请求:首次用初始参数,后续用下一页URL
    if next_page_url:
        response = requests.get(next_page_url, headers=headers)
    else:
        response = requests.get(base_url, headers=headers, params=initial_params)
    
    if response.status_code != 200:
        print(f'请求失败,状态码: {response.status_code}')
        break
    
    # 收集当前页订单
    current_orders = response.json()['orders']
    all_orders.extend(current_orders)
    
    # 检查并解析下一页链接
    link_header = response.headers.get('Link')
    if not link_header:
        break
    
    next_match = re.search(r'<([^>]+)>; rel="next"', link_header)
    if not next_match:
        break
    
    next_page_url = next_match.group(1)

# 处理并输出订单数据
if all_orders:
    # 扁平化JSON数据,整合原有的数据处理逻辑
    df = pd.json_normalize(
        all_orders,
        sep='_',
        record_path='line_items',
        meta=['name', 'id', 'created_at'],
        meta_prefix='meta_'
    )
    
    # 转换日期格式为仅日期部分
    df['meta_created_at'] = df['meta_created_at'].apply(
        lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S%z').date()
    )
    
    # 计算折扣后实际支付金额
    df['price_set_shop_money_amount'] = pd.to_numeric(df['price_set_shop_money_amount'])
    df['total_discount_set_shop_money_amount'] = pd.to_numeric(df['total_discount_set_shop_money_amount'])
    df['paid_afterdiscount'] = df['price_set_shop_money_amount'] - df['total_discount_set_shop_money_amount']
    
    # 输出指定字段
    print(df[[
        'meta_name','meta_created_at','sku','title',
        'fulfillable_quantity','quantity','paid_afterdiscount'
    ]])
else:
    print('未获取到任何订单数据')

关键改进点

  • 合规分页处理:通过解析响应头Link字段自动获取下一页URL,完全符合Shopify API的分页规范
  • 请求效率优化:设置limit=250(API允许的最大值),大幅减少请求次数
  • URL参数规范化:用params参数传递查询条件,避免手动拼接URL的格式错误
  • 简化数据处理:合并原代码中重复的DataFrame操作,减少冗余逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:30:42