如何使用Python爬取需登录网站并获取账户详情(不使用Selenium)
无Selenium实现目标网站登录与账户数据爬取
核心思路
绕过浏览器模拟,直接通过HTTP请求模拟登录流程,利用会话保持获取登录后的权限,再请求账户数据接口。以下是具体步骤:
1. 抓包分析登录流程
打开浏览器开发者工具(F12),切换到Network面板,勾选Preserve log,手动完成一次登录:
- 定位登录触发的POST请求(路径通常包含
login/auth等关键词),记录:- 请求URL(登录接口地址)
- 请求头:重点保留
User-Agent、Content-Type、Referer、X-CSRF-Token(若存在) - 请求体:确认参数格式(JSON/表单)及必填字段(用户名、密码、验证码、随机token等)
- 查看登录成功后的响应,确认会话cookie或身份token(后续请求需携带)
2. 用Python构造登录请求
使用requests库的Session对象维持会话(自动保存cookie):
import requests import re # 初始化会话 session = requests.Session() # 模拟真实浏览器请求头 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", "Content-Type": "application/json", # 按抓包结果调整,可能是application/x-www-form-urlencoded "Referer": "https://online.cspension.com.hk/hkpensionweb/#/login?source=corporateHK&vgnLocale=en_CA" } # 1. 先请求登录页面,提取CSRF token(若页面包含) login_page = session.get("https://online.cspension.com.hk/hkpensionweb/#/login?source=corporateHK&vgnLocale=en_CA", headers=headers) csrf_token = re.search(r'<meta name="csrf-token" content="(.*?)">', login_page.text).group(1) if "csrf-token" in login_page.text else "" # 2. 构造登录参数 login_data = { "username": "你的用户名", "password": "你的密码", "csrfToken": csrf_token, # 有则加,无则删 # 补充抓包得到的其他必填参数,如source、验证码等 } # 3. 发送登录请求 login_response = session.post("登录接口URL", headers=headers, json=login_data) # 表单格式用data=login_data # 验证登录状态 if login_response.status_code == 200 and "success" in login_response.text: print("登录成功") else: print("登录失败,检查参数/请求头或是否有验证码")
3. 请求账户详情数据
登录成功后,用同一会话请求账户数据接口(抓包获取对应API):
# 请求账户详情,替换为实际接口URL account_response = session.get("账户详情接口URL", headers=headers) # 解析响应数据(通常为JSON格式) account_data = account_response.json() print(account_data)
关键注意事项
- 反爬应对:添加随机延迟避免频繁请求,保持请求头与浏览器完全一致
- 动态参数处理:若存在每次刷新页面都会变化的token,必须先请求登录页面提取后再构造登录请求
- 验证码处理:若网站有验证码,需集成OCR工具(如Tesseract)识别;若为滑块/点选验证码,此方法会受限
- 会话维护:部分网站会定期刷新会话token,若后续请求失败,需重新执行登录流程
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

