如何正确复制网站API的GET请求以抓取Jewelosco产品数据?
以下是针对性的排查和解决步骤:
核对完整请求参数
打开浏览器Network面板,找到返回产品数据的GET请求,复制URL中?后的所有查询参数(比如pageSize、storeId、sortBy、甚至可能的动态时间戳参数),确保Python请求的params字典和浏览器完全一致,不要遗漏任何参数。更新Cookie并维持会话连贯
Cookie中的会话字段(如sessionId)时效性极短,需重新打开搜索页面后复制最新的Cookie。建议用requests.Session()先请求搜索页面(https://www.jewelosco.com/shop/search-results.html?q=rice),自动保存会话Cookie后,再发起API请求,避免会话中断。完全匹配请求头
复制浏览器中该API请求的所有请求头,包括User-Agent(必须和浏览器的字符串完全一致,比如Chrome的完整UA)、Referer(设为搜索页面URL)、Accept、Accept-Language、Accept-Encoding等,不要省略任何字段——部分网站会通过头信息验证请求合法性。验证Ocp-Apim-Subscription-Key的有效性
该密钥可能与当前会话绑定,每次刷新页面都会生成新值。重新从Network面板的API请求中提取最新的密钥,替换掉之前保存的旧值。模拟浏览器请求顺序
先让Python请求搜索页面,等待1-2秒(模拟浏览器加载时间),再发起API请求,避免直接跳过页面触发反爬机制。控制请求频率
不要连续快速发送请求,每次请求后添加time.sleep(2)左右的延迟,降低触发反爬限制的概率。
示例代码(使用Session维持会话)
import requests import time # 初始化会话 session = requests.Session() # 先访问搜索页面,获取会话Cookie search_url = "https://www.jewelosco.com/shop/search-results.html?q=rice" base_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "https://www.jewelosco.com/", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" } session.get(search_url, headers=base_headers) time.sleep(2) # 发起API请求,替换为你从Network复制的真实信息 api_url = "复制的API接口URL" api_headers = { "User-Agent": base_headers["User-Agent"], "Referer": search_url, "Ocp-Apim-Subscription-Key": "最新提取的订阅密钥", "Accept": "application/json, text/plain, */*", # 添加所有其他从浏览器复制的请求头 } api_params = { "q": "rice", "pageSize": "24", "storeId": "你的门店ID", # 添加所有其他从URL查询参数中复制的字段 } response = session.get(api_url, headers=api_headers, params=api_params) print(response.json())
内容的提问来源于stack exchange,提问作者übermensch

