GET 和 POST 这两个词,做网络相关的多少都听过,但真让你写一段"登录"的脚本,很多人会卡在第一步——不知道往哪发、发什么、怎么看才算成功。这篇就拿我自己的站(www.1314zf.com,emlog 程序)当例子,把一次 POST 登录从页面到代码完整走一遍。学会了这套,绝大多数带登录的接口你都能自己摸出来。
先分清 GET 和 POST
说白了就两句话:
- GET 是去要数据的,参数挂在网址后面,比如 ?page=2
- POST 是把数据交上去的,表单内容放在请求体里,不暴露在网址上
登录、发评论、提交表单、改设置,基本都是 POST。因为密码这种东西不能写在网址里让人看到。
打开登录页,先"偷看"表单
浏览器访问 https://www.1314zf.com/admin/,F12 打开开发者工具,或者直接右键查看网页源码,找到登录那一段表单,核心信息就这几行:
<form method="post" action="./account.php?action=dosignin&s=">
<input name="user" type="text"> 用户名 / 邮箱
<input name="pw" type="password"> 密码
<input name="login_code" type="text"> 验证码
<input name="persist" type="checkbox"> 记住登录
</form>
别看它不起眼,写登录脚本需要的全部信息都在这了:
- action 告诉你要往哪发:./account.php?action=dosignin,相对 admin 目录,完整地址就是 https://www.1314zf.com/admin/account.php?action=dosignin
- method="post" 告诉你要用 POST
- 几个 name 就是提交时要带的字段名:user、pw、login_code、persist
字段名一个都不能错,错了服务器就收不到。这也是新手最容易翻车的地方——先看表单再写代码,别瞎猜。
验证码这一步,老老实实人工配合
emlog 后台登录带图形验证码,图片地址是 https://www.1314zf.com/include/lib/checkcode.php(在登录页源码里能直接看到)。
脚本里的做法是:先把这张验证码图下载下来,打开看一眼,把数字手动填进去,再提交。全自动识别验证码不在本文范围——那属于灰色地带,还容易触发风控,正经项目别碰。
Python 实现:四步登录
代码用 Python 的 requests 库,思路是"一个会话、拿图、填表、看结果"。
# -*- coding: utf-8 -*-
"""
POST 登录实例: 登录 1314zf.com (emlog) 后台
流程: 建会话 -> 下载验证码 -> 人工输入 -> POST 提交 -> 判断结果
"""
import requests
BASE = 'https://www.1314zf.com'
# 1) 建会话。requests.Session 会自动管理 cookie,
# 登录的会话状态全靠它, 不要用裸 requests.post
s = requests.Session()
s.headers['User-Agent'] = (
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/120.0 Safari/537.36'
)
# 2) 先访问一次登录页, 拿到会话 cookie, 再下载验证码
s.get(BASE + '/admin/')
code_img = s.get(BASE + '/include/lib/checkcode.php')
with open('checkcode.png', 'wb') as f:
f.write(code_img.content)
code = input('请打开 checkcode.png 输入验证码: ')
# 3) 构造 POST 表单并提交
data = {
'user': '你的用户名或邮箱',
'pw': '你的密码',
'login_code': code,
'persist': '1', # 记住登录
}
r = s.post(BASE + '/admin/account.php?action=dosignin&s=', data=data)
# 4) 看结果
print('HTTP 状态码:', r.status_code)
print('最终地址:', r.url)
print('会话Cookie:', dict(s.cookies))
input() 这一步脚本会停下来等你在黑窗口里输入验证码,输入完回车就继续提交。
怎么判断登录成功了
请求发出去了,怎么知道成没成?三个办法:
- 看 Cookie:emlog 登录成功会在会话里种下 em_auth_key 之类的认证 cookie,打印 dict(s.cookies) 能看到
- 看跳转:成功一般会 302 跳到后台 https://www.1314zf.com/admin/,看 r.url 落在哪
- 看受保护页面:登录后再 GET 一个只有后台才能访问的地址,能拿到正常内容就说明会话有效
常见坑,按顺序排
- 不建 Session 直接用 requests.post:验证码和登录提交成了两次独立请求,cookie 对不上,永远登录失败。这是最高频的错
- 忘了 User-Agent:部分环境会拒掉没有浏览器标识的请求,先把请求头带上
- 验证码有时效:下载验证码和提交之间别拖太久,过期了重新来
- 字段名抄错:拿不准就开 F12 网络面板,看真正的 Form Data 是什么
- 登录成功不等于完事:后续访问后台页面还得靠同一个 session,别新开请求
收个尾
POST 登录的原理就这么点东西:找表单、照搬字段、保持会话。学会了这一套,登录类接口基本都能举一反三——改改 URL、换换字段名就是另一个网站的登录脚本。下一篇可以接着讲登录之后怎么带着 cookie 抓后台数据、怎么处理分页。

评论一下?