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
相关产品推荐
相关产品推荐

