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学习之asyncore模块用法实例教程
Sep 29 Python
Python使用爬虫猜密码
Feb 19 Python
python安装Scrapy图文教程
Aug 14 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
python实现图书馆研习室自动预约功能
Apr 27 Python
Python requests发送post请求的一些疑点
May 20 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
Python使用jpype模块调用jar包过程解析
Jul 29 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
介绍几个array库的新函数 php
2006/12/29 PHP
PHP日期处理函数 整型日期格式
2011/01/12 PHP
Array of country list in PHP with Zend Framework
2011/10/17 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
jQuery动态添加
2016/04/07 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
总务岗位职责
2013/11/19 职场文书
技术副厂长岗位职责
2013/12/26 职场文书
三八活动策划方案
2014/08/17 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
redis 限制内存使用大小的实现
2021/05/08 Redis