Python爬虫怎么实现自动登录_使用Selenium填写表单并保存Session

Python爬虫怎么实现自动登录_使用Selenium填写表单并保存Session

Python

直接用requests模拟登录常失败,因现代网站依赖JavaScript动态生成验证码、加密密码、csrf_token等字段,手动构造易遗漏;Selenium可执行JS获取全部参数,但需正确提取Cookie并注入requests.Session才能复用登录态。

为什么直接用 requests 模拟登录经常失败

因为现代网站大量依赖 JavaScript 渲染登录逻辑:验证码动态加载、密码加密、隐藏字段(如 csrf_token)实时生成、按钮点击触发多步校验。用 requests 手动构造请求,往往漏掉某个 JS 生成的参数或时机,导致返回 403 或跳转到登录页。

Selenium 真实启动浏览器,能完整执行页面 JS,自然获取所有动态字段和事件绑定。但注意:它不自动保存登录后的 Session 给后续 requests 复用——这是常见误解。

  • 浏览器驱动(如 ChromeDriver)必须与 Chrome 版本匹配,否则 WebDriverException: unknown error: cannot find Chrome binary
  • 默认无头模式下部分网站会检测并拒绝访问,需添加 --disable-blink-features=AutomationControlled 和伪造 User-Agent
  • time.sleep() 不可靠,优先用 WebDriverWait 等待元素出现,否则容易因加载延迟导致 NoSuchElementException

Selenium 填写表单的关键三步

不是“找到输入框 → send_keys → 点击登录”就完事。真实场景中,表单常有防自动化机制,必须模拟人眼可见的操作流。

以某教务系统为例(用户名 input#username、密码 input#password、登录按钮 button[type="submit"]):

  • 先显式等待登录框完全加载:WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))
  • 输入前清空原有内容:username_field.clear(),避免残留值干扰
  • ActionChains 模拟人工输入节奏(防反爬):ActionChains(driver).move_to_element(username_field).click().send_keys("user").perform()
  • 提交前检查按钮是否可点击:driver.find_element(By.CSS_SELECTOR, "button[type='submit']").is_enabled(),否则可能被 disabled 属性拦截

如何把 Selenium 的登录态传给 requests

不能直接复用 driver.get_cookies() 生成的字典——requests.Session() 需要的是标准 Cookie 字符串,且部分网站的 Cookie(如 HttpOnly)无法通过 JS 获取,Selenium 返回的 cookie 列表里不含它们。

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

更可靠的做法是:让 Selenium 完成登录后,从其 driver 中提取所有可访问的 Cookie,再注入到 requests.Session

# 登录成功后
cookies = driver.get_cookies()
session = requests.Session()
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'], path=cookie['path'])
# 后续用 session.get() 即可携带登录态
response = session.get("https://example.com/profile")
  • 务必检查 cookie['domain'] 是否包含前置点(如 .example.com),requests 对 domain 格式敏感,错填会导致 Cookie 不发送
  • 如果目标页面依赖 localStorage 或 sessionStorage,requests 无法继承——此时只能全程用 Selenium 访问,或改用 undetected-chromedriver 避免被识别为自动化
  • 某些网站(如微信公众号后台)会校验请求来源的 UA 和 Referer,仅传 Cookie 不够,需同步设置 session.headers.update({"User-Agent": ..., "Referer": ...})

保存和复用登录 Session 的实际限制

所谓“保存 Session”,本质是保存 Cookie + 请求头上下文。但多数网站的登录态有效期短(30 分钟~2 小时),且服务端会校验 IP、User-Agent 变化、操作行为特征。硬存一个 pickle 文件下次直接读取,大概率失效。

  • 不要序列化整个 requests.Session 对象——其中含不可序列化的连接池、钩子函数,pickle.dump() 会报错
  • 可安全持久化的只有 Cookie 字典(过滤掉 expiryhttpOnly 等非必要字段)和 headers 字典
  • 真正稳定的方案是:封装一个 login_if_needed() 函数,每次任务开始时检查 session.get("/api/check-login").json()["logged_in"],未登录则触发 Selenium 登录流程

Session 复用不是一劳永逸的事,关键在理解服务端怎么验证身份——Cookie 只是载体,背后是时间戳、签名、设备指纹的组合校验。

本文地址:https://www.sztg.com.cn/article/668243.html

如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!

猜您喜欢