python requests模拟登陆github的实现方法


Posted in Python onDecember 26, 2019

1. Cookie 介绍

HTTP 协议是无状态的。因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一个典型的应用场景,就是用于记录用户在网站上的登录状态。

  • 用户登录成功后,服务器下发一个(通常是加密了的)Cookie 文件。
  • 客户端(通常是网页浏览器)将收到的 Cookie 文件保存起来。
  • 下次客户端与服务器连接时,将 Cookie 文件发送给服务器,由服务器校验其含义,恢复登录状态(从而避免再次登录)。

2.requests使用cookie

当浏览器作为客户端与远端服务器连接时,远端服务器会根据需要,产生一个 SessionID,并附在 Cookie 中发给浏览器。接下来的时间里,只要 Cookie 不过期,浏览器与远端服务器的连接,都会使用这个 SessionID;而浏览器会自动与服务器协作,维护相应的 Cookie。

requests中,也是这样。我们可以创建一个requests.Session,尔后在该 Session 中与远端服务器通信,其中产生的 Cookie,requests会自动为我们维护好。

3. POST 表单

post 方法可以将一组用户数据,以表单的形式发送到远端服务器。远端服务器接受后,依照表单内容做相应的动作。

调用requests的 POST 方法时,可以用data参数接收一个 Python 字典结构。requests会自动将 Python 字典序列化为实际的表单内容。例如:

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

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

python requests模拟登陆github的实现方法

而在 Chrome 的审查元素窗口中,我们可以看到提交给session接口的表单信息。内里包含

  1. commit
  2. utf8
  3. authenticity_token
  4. login
  5. password

python requests模拟登陆github的实现方法

其中,commitutf8两项是定值;loginpassword分别是用户名和密码,这很好理解。唯独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 首页.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用PYTHON创建XML文档
Mar 01 Python
python处理json数据中的中文
Mar 06 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
python机器学习实战之树回归详解
Dec 20 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
使用pip安装python库的多种方式
Jul 31 Python
在Python中使用MySQL--PyMySQL的基本使用方法
Nov 19 Python
Python-opencv 双线性插值实例
Jan 17 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 Python
python 实现按对象传值
Dec 26 #Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 #Python
Pandas时间序列:重采样及频率转换方式
Dec 26 #Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 #Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 #Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 #Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 #Python
You might like
操作Oracle的php类
2006/10/09 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
JSON格式化输出
2014/11/10 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
vue中轮训器的使用
2019/01/27 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
简单谈谈python中的多进程
2016/11/06 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python conda操作方法
2019/09/11 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
优秀毕业大学生推荐信
2013/11/13 职场文书
销售找工作求职信
2013/12/20 职场文书
生日寄语大全
2014/04/08 职场文书
个人担保书范文
2014/05/20 职场文书
幼儿园运动会口号
2014/06/07 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
民间个人借款协议书
2014/09/30 职场文书
入党介绍人意见范文
2015/06/01 职场文书
MySQL基于索引的压力测试的实现
2021/11/07 MySQL