根本原因是未完整模拟浏览器行为:需先GET登录页解析动态token、用Session自动管理Cookie、补全User-Agent/Referer等头,若含JS计算或验证码则必须换Selenium。

用 requests 模拟登录时为什么总返回 403 或重定向到登录页?
因为多数现代网站(尤其是带反爬机制的)依赖客户端执行 JavaScript 渲染、生成动态 token(如 csrf_token、_token)、或通过 Set-Cookie 设置会话凭证后才允许提交表单。单纯发 POST 请求不带完整会话上下文,服务器直接拒掉。
- 必须先
GET登录页,解析出隐藏字段(如<input type="hidden" name="csrf_token" value="xxx">),并保留响应中的Set-Cookie - 使用同一个
requests.Session()实例贯穿整个流程,自动管理 cookies 和连接复用 - 检查目标网站是否在登录请求头中校验
User-Agent、Referer,缺失就补上 - 若页面含验证码(文字/滑块),
requests无法处理,得换selenium或接入 OCR 接口
什么时候该切到 selenium 而不是硬刚 requests?
当遇到以下任一情况,requests 基本失效,必须上浏览器自动化:
- 登录表单提交前需执行 JS 计算(如加密密码、生成时间戳签名)
- 页面用
fetch/axios异步加载登录接口,且请求体含动态 header(如X-Requested-With或自定义 token) - 签到按钮是
disabled状态,需先触发某事件(如点击“我已阅读协议”)才可点击 - 登录后跳转逻辑由前端路由控制(如
vue-router),服务端不返回真实跳转地址
示例判断点:打开开发者工具 → Network → 切到登录页 → 点击登录 → 查看实际发出的 XHR 请求 URL、Headers、Payload。如果 Payload 里有 timestamp、sign、signature 字段,基本要放弃纯 requests。
用 selenium 实现稳定签到的关键配置项有哪些?
避免脚本跑着跑着就卡住或找不到元素,这几个配置不能省:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- 启动时加
--headless=new(Python 3.10+ 推荐新 headless 模式),不加容易被检测为非真实用户 - 设置
options.add_argument("--disable-blink-features=AutomationControlled")并后续执行driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...})覆盖navigator.webdriver - 显式等待代替
time.sleep():WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "sign-btn"))) - 登录后检查是否真跳转成功,别只靠 URL 包含
"dashboard"就认为登录完成——有些网站登录失败也跳 dashboard,但页面显示“请重新登录”,得用driver.find_element(By.CLASS_NAME, "error-tip")这类兜底判断
签到成功后如何防止重复执行?
自动化脚本最怕每天定时跑两次,导致重复打卡失败甚至被封号:
- 在签到逻辑前加时间判断:
if datetime.now().hour ,限定只在上午 9 点前执行(适配多数企业打卡时段) - 写本地状态文件,比如每次成功后写入
last_sign_date = "2024-06-15"到./status.json,下次运行先读取比对 - 若网站提供“今日已签到”提示文案,用
driver.find_elements(By.XPATH, "//*[contains(text(), '今日已签到')]")检测,有结果就直接退出
网页签到看似简单,真正卡住人的永远是那个没在文档里写的动态参数,或是凌晨三点突然改版的登录接口。动手前花十分钟抓包看清楚真实请求链路,比写一小时重试逻辑更省时间。

















