如何仅用Requests模块替代Selenium获取Nike登录所需的用户ID字符串
Great question—this is definitely a tricky one, but let’s break down the actionable steps you can take to replicate that local storage value using just requests and JavaScript execution in Python.
入手方向拆解
1. 先梳理完整的登录前置请求链
打开浏览器开发者工具的「Network」标签,从头走一遍Nike的登录流程,重点记录登录POST请求之前的所有请求:
- Nike登录门户的初始页面加载请求
- 任何获取配置、令牌、会话数据的API调用
- 会设置Cookie或修改localStorage的请求
你在POST URL里看到的长串,几乎肯定是从这些前置请求返回的数据(比如会话令牌、随机数nonce、用户专属种子值)生成的。把所有看起来相关的Cookie、响应头、JSON payload都记下来——后续会用到这些数据。
2. 定位生成目标字符串的JavaScript代码
切换到「Sources」标签,用搜索功能查找该长串(或存储它的localStorage键名)的引用。你要找的是这样的代码:
- 从Cookie、响应数据或其他浏览器状态中读取值
- 执行哈希/加密函数(比如SHA-256、HMAC,或者Nike自定义的逻辑)
- 将结果写入localStorage,或者直接用于登录POST的URL
找到负责生成的函数后,把整个相关代码块(包括它依赖的所有辅助函数)复制出来。
3. 在Python中执行提取的JavaScript代码
要在无浏览器环境下运行这段JS,可以用支持JS执行的Python库,比如PyExecJS,或者通过子进程调用Node.js。这里给个大致的实现框架:
import execjs import requests # 第一步:获取所有登录前置数据(Cookie、令牌等) session = requests.Session() pre_login_res = session.get("https://www.nike.com/login") # 从Cookie或响应内容中提取必要参数,比如seed_value、nonce等 # 加载提取到的JS代码 js_code = """ function generateTargetString(seedValue, nonce) { // 粘贴你从浏览器中提取的Nike生成逻辑代码 return customNikeEncryptionLogic(seedValue, nonce); } """ # 创建JS执行上下文 ctx = execjs.compile(js_code) # 传入参数调用函数,得到目标长串 target_string = ctx.call("generateTargetString", seed_value, nonce) # 用这个字符串构造登录POST URL并发起请求 login_url = f"https://www.nike.com/login/{target_string}" login_payload = {"username": "your_username", "password": "your_password"} session.post(login_url, data=login_payload)
4. 完美模拟浏览器状态
Nike有严格的反爬机制,所以你需要:
- 完全复制浏览器请求的所有头信息(User-Agent、Accept、Referer等)
- 在
requests会话中全程维护同一个Cookie罐,不要丢弃前置请求设置的任何Cookie - 如果JS用到了浏览器专属API(比如
window.crypto),你需要在JS代码中模拟这些API,或者用Python的加密库(比如cryptography)实现相同的逻辑
5. 验证并迭代测试
分步验证每一步:
- 给JS函数传入和浏览器相同的参数,检查输出是否和你在localStorage中看到的长串一致
- 如果输出不匹配,检查是否遗漏了依赖的JS函数,或者有没有隐藏参数(比如时间戳、CSRF令牌)没抓取到
- 如果Nike更新了逻辑,重复前面的步骤重新提取最新的JS代码
内容的提问来源于stack exchange,提问作者Ty Liu
相关产品推荐
相关产品推荐

