使用Python Requests登录Zalando.it遇403错误及代理问题求助
登录请求403错误排查与修复
核心问题点及修复方案
请求头配置错误
Host头需动态适配:Session初始设置的Host是www.zalando.it,但后续请求accounts.zalando.com域名时,Host会不匹配,直接触发反爬拦截。建议移除全局Host配置,让Requests自动根据目标URL生成正确的Host头。- 移除冗余自定义头:
x-zalando-render-page-uri和x-zalando-request-uri如果不是浏览器实际发送的请求头,不要手动添加,这类非标准头容易被识别为异常请求。 - 确认XSRF Token来源:部分网站的XSRF Token会放在页面meta标签而非Cookie中,建议用BeautifulSoup解析登录页面HTML,优先从类似
<meta name="csrf-token" content="xxx">的标签提取,而非直接取Cookie中的frsx。
登录数据格式错误
代码中login_data的键名存在笔误:'email:'多了一个冒号,应改为'email'。同时需确认data.request和data.secret是否为浏览器实际发送的动态参数——这类参数通常从登录页面隐藏字段或login_api_schema响应中生成,而非固定值,需重新抓取验证。会话与Cookie管理问题
- 保留完整Cookie:不要仅提取
frsx和Zalando-Client-Id,Session需保留从登录页面获取的所有Cookie,部分反爬机制会校验Cookie完整性。 - 跟进请求链的更新:请求
login_api_schema后,检查响应是否返回新的Cookie或头信息,需同步更新到Session中。
- 保留完整Cookie:不要仅提取
反爬行为模拟优化
- 添加
Referer头:提交登录请求时,Referer需设置为登录页面URL(https://www.zalando.it/login/),而非首页。 - 还原真实请求顺序:先访问登录页面,再请求
login_api_schema,最后提交登录数据,完全模拟用户操作流程。
- 添加
修改后的示例代码
import requests import data from bs4 import BeautifulSoup login_page_link = "https://www.zalando.it/login/" login_api_schema = "https://accounts.zalando.com/api/login/schema" login_api_post = "https://accounts.zalando.com/api/login" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate', 'DNT': '1', 'Connection': 'close', 'Upgrade-Insecure-Requests': '1' } with requests.Session() as s: s.headers.update(headers) # 先访问登录页面,获取完整会话信息 r = s.get(login_page_link) soup = BeautifulSoup(r.text, 'html.parser') # 优先从meta标签提取XSRF Token xsrf_meta = soup.find('meta', attrs={'name': 'csrf-token'}) if xsrf_meta: s.headers['x-xsrf-token'] = xsrf_meta.get('content') else: # fallback到Cookie中的frsx cookie_dict = s.cookies.get_dict() if 'frsx' in cookie_dict: s.headers['x-xsrf-token'] = cookie_dict['frsx'] # 更新XHR请求专属头 del s.headers['Upgrade-Insecure-Requests'] s.headers['Accept'] = 'application/json' # 提取必要的会话标识头 cookie_dict = s.cookies.get_dict() if 'Zalando-Client-Id' in cookie_dict: s.headers['x-zalando-client-id'] = cookie_dict['Zalando-Client-Id'] if 'X-Flow-Id' in r.headers: s.headers['x-flow-id'] = r.headers['X-Flow-Id'] # 请求登录schema接口 r = s.get(login_api_schema) # 设置跨域相关头 s.headers['Origin'] = 'https://www.zalando.it' s.headers['Referer'] = login_page_link # 修正登录数据格式 login_data = { 'email': data.email, 'request': data.request, 'secret': data.secret } # 发送登录请求 r = s.post(login_api_post, json=login_data) print(r.status_code) print(r.text)
Fiddler代理问题修复
出现SSL: WRONG_VERSION_NUMBER错误及HTTP请求301跳转的原因如下:
- 代理URL配置错误:Fiddler作为HTTP代理,HTTPS请求的代理地址需使用HTTP协议,而非HTTPS。正确的代理配置应为:
proxies = { 'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888' } - SSL证书信任问题:需安装Fiddler根证书,确保Python能信任其SSL证书。测试阶段可临时关闭SSL验证(仅用于调试):
r = s.get(login_page_link, proxies=proxies, verify=False) - 301跳转问题:Zalando强制使用HTTPS协议,所有请求需使用HTTPS URL,不要用HTTP发起请求。
内容的提问来源于stack exchange,提问作者Alessio Milano
相关产品推荐
相关产品推荐

