Python使用requests库模拟GitHub登录的完整教程
本文详解如何利用Python的requests库模拟GitHub登录流程。通过解析HTTP无状态特性,掌握Cookie与Session的维护机制。重点讲解如何从登录页面提取authenticity_token(CSRF令牌),构造POST表单数据,并发送请求至session接口实现自动登录,最终通过状态码判断登录结果。
Cookie 与 Session 基础
1. Cookie 介绍
HTTP 协议本身是无状态的,这意味着服务器无法自动识别之前的通信历史。为了弥补这一缺陷,Cookie 成为一种常用的技术手段。其典型应用场景包括记录用户的登录状态,使服务器能够识别特定用户。
- 当用户成功登录后,服务器会生成一个通常经过加密的 Cookie 文件并下发给客户端。
- 客户端(例如网页浏览器)接收到该 Cookie 文件后,会将其本地保存。
- 在后续与服务器的连接中,客户端会自动发送该 Cookie 文件。服务器通过校验其内容来恢复用户的登录状态,从而避免用户重复登录操作。
2.requests使用cookie
当浏览器作为客户端与远程服务器建立连接时,服务器会根据需求生成一个 SessionID 并将其附加在 Cookie 中发送给浏览器。只要 Cookie 未过期,后续的所有通信都将沿用该 SessionID,且浏览器会自动与服务器协作以维护相关的 Cookie 数据。
在requests库中,处理 Cookie 的方式与此类似。我们可以创建一个requests.Session对象,随后在该 Session 实例中与远程服务器进行通信。在此过程中产生的 Cookie,requests库会自动为我们进行维护和管理。
POST 表单提交机制
3. POST 表单
POST 方法允许将一组用户数据以表单的形式发送至远程服务器。服务器接收数据后,会根据表单内容执行相应的操作。
调用requests库的 POST 方法时,可以使用data参数传入一个 Python 字典结构。requests库会自动将该字典序列化为实际的表单内容。例如:
import requests
cs_url = 'http://httpbin.org/post'
my_data = {
'key1' : 'value1',
'key2' : 'value2'
}
r = requests.post (cs_url, data = my_data)
print r.content
GitHub 登录流程分析与实现
4. 实际模拟登录 GitHub 试试看
模拟登录的第一步,首先需要理清使用浏览器登录时发生的具体过程。
GitHub 的登录页面地址为 https://github.com/login。首先清空浏览器中的 Cookie 记录,然后使用 Chrome 浏览器打开该登录页面。在填入 Username 和 Password 后,打开 Tamper Chrome 扩展以及 Chrome 的元素审查工具(切换到 Network 标签页),最后点击登录按钮。
通过 Tamper Chrome 观察发现:虽然登录页面地址是 https://github.com/login,但实际接收表单数据的接口是 https://github.com/session。若登录成功,页面将重定向至 https://github.com/ 首页,并返回状态码200。

在 Chrome 的审查元素窗口中,可以看到提交给session接口的表单信息。其内部包含以下字段:
- commit
- utf8
- authenticity_token
- login
- password

在上述字段中,commit和utf8的值是固定的;login和password分别对应输入的用户名和密码,这符合常规逻辑。唯独authenticity_token是一串看似无规律的长字符,其具体含义尚不明确。
由于 POST 动作发生在与session接口交互之前,因此该数据的来源只能是login接口。我们打开 login 页面的源代码,搜索authenticity_token不难发现如下内容:
<input name="authenticity_token" type="hidden" value="......" />
原来,所谓的authenticity_token是直接写在 HTML 页面中的,只是通过hidden模式进行了隐藏。因此,我们只需使用 Python 的正则表达式库进行解析即可获取该值。
import requests
import re
login_url = 'https://github.com/login'
user = 'user' //具体账号
password = 'password' //具体密码
user_headers = {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding' : 'gzip',
'Accept-Language' : 'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4'
}
session = requests.Session()
response = session.get(login_url, headers = user_headers)
pattern = re.compile(r'<input name="authenticity_token" type="hidden" value="(.*)" />')
authenticity_token = pattern.findall(response.content)[0]
login_data = {
'commit' : 'Sign in',
'utf8' : '%E2%9C%93',
'authenticity_token' : authenticity_token,'login' : user,
'password' : password
}
session_url = 'https://github.com/session'
response = session.post(session_url, headers = user_headers, data = login_data)
1. 首先,我们配置了与 Chrome 浏览器一致的 HTTP 请求头部信息。其中,User-Agent字段尤为关键。
2. 为了模拟浏览器与服务器的通信,我们创建了一个requests.Session实例。
3. 使用 GET 方法访问登录页面,并利用正则库解析出authenticity_token的值。
4. 将所需的数据整理为一个 Python 字典,命名为 login_data。
5. 最后,使用 POST 方法将表单数据提交至session接口。
6. 最终结果通过302状态码进行重定向跳转,成功打开了(状态码为200的)GitHub 首页。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













