如何使用python-requests模拟登录站点并向JS接口发送POST请求获取数据
解决方案
1. 仅用requests完全可以实现需求,你当前代码的错误点如下
- 传参格式错误:
data = str(action2)是将Python字典转为Python风格字符串,不是标准JSON格式,服务端无法解析。你应该用json=action2参数让requests自动序列化为标准JSON,同时自动设置正确的Content-Type请求头。 - 请求头配置错误:你重复定义了
Content-Type,还写死了Content-Length,不同请求体长度不同,写死会直接导致请求被服务端拒绝,这两个字段无需手动配置,requests会自动生成。 - 缺少CSRF Token提取逻辑:你首次GET请求主站后,CSRF Token一般存储在响应的Cookie或者HTML的meta标签中,需要先提取该值,再添加到后续POST请求的请求头中(通常字段名为
X-CSRFToken,可通过浏览器抓包确认具体字段名)。 - 未模拟完整登录流程:你没有先调用登录接口传递账号密码生成登录态Session,未登录的Session请求需要权限的接口自然会被拒绝。
2. 修正后的实现步骤
- 先通过浏览器抓包确认登录接口的地址、请求参数格式,先调用登录接口生成有效登录态,requests.Session会自动存储登录后的Cookie,不需要手动处理。
- 首次GET主站后,从响应Cookie或者HTML中提取CSRF Token,添加到后续请求的公共请求头中。
- 按浏览器抓包的真实请求参数,请求
/backend/connect/models.js接口,不要自己构造测试参数,完全复现浏览器的请求体内容即可。
修正后的代码示例:
import requests from bs4 import BeautifulSoup s = requests.Session() # 配置通用请求头,去掉错误的固定字段 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36', 'x-echo-context': 'salesconnect', 'origin':'https://connect.echobotsales.de', 'referer':'https://connect.echobotsales.de', 'accept': 'application/json, text/plain, */*' } s.headers.update(headers) # 第一步:访问主站获取Cookie和CSRF res = s.get('https://connect.echobotsales.de/#/company/LoD2z50vDE') # 提取CSRF,示例为从meta标签提取,根据实际情况调整 soup = BeautifulSoup(res.text, 'html.parser') csrf_tag = soup.find('meta', {'name': 'csrf-token'}) if csrf_tag: csrf_token = csrf_tag['content'] s.headers.update({'X-CSRFToken': csrf_token}) # 也可从Cookie提取:csrf_token = s.cookies.get('csrftoken') # 第二步:调用登录接口,此处替换为你抓包的真实登录参数 login_data = { 'username': '你的账号', 'password': '你的密码' } login_res = s.post('https://connect.echobotsales.de/你的登录接口', json=login_data) # 确认登录成功后再请求数据接口 # 第三步:请求数据接口,替换为真实的请求payload action2 = {'action':'initCsrf'} response = s.post('https://connect.echobotsales.de/backend/connect/models.js', json=action2) print(response.json())
3. 备选轻量化方案
如果站点存在前端JS加密参数、动态生成签名等反爬逻辑,调试成本过高,可以选用比Selenium效率高得多的替代方案:
- 用
requests-html库:内置Chromium内核,支持JS渲染,API和requests几乎一致,资源占用远低于Selenium,爬取10万条数据的效率完全满足需求。 - 临时方案:先在浏览器手动登录,复制有效的Cookie和CSRF Token放到请求头中,直接调用数据接口,适合短期爬取需求。
内容的提问来源于stack exchange,提问作者shahrOZe
相关产品推荐
相关产品推荐

