新版知乎登录之post请求
前言
在上一篇文章中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱。
疑惑
在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/x-www-form-urlencoded)的方式,而是上传文件(multipart/form-data),这是为什么呢?知乎登录post请求该怎么发送呢?
本质
我想说的是一般情况下是使用提交Form表单的方式进行登录,但是不排除其他的方式。大家要透过现象看本质,登录验证的本质上是客户端发送验证消息,服务端校验消息,返回响应。登录验证可以使用提交Form表单,可以使用发送ajax,也可以上传验证文件,甚至我不用http请求,使用Websocket,都是可以的,这没必要纠结。好多朋友在知乎登录的时候,就傻眼了?这个怎么使用requests发送post请求呢?
新版知乎登录分析
首先打开谷歌浏览器,同时F12,打开开发者模式,并勾选Preserve log。
接着在知乎登录首页,输入账号与密码,开始登录。(这次不涉及验证码的分析)
知乎登录请求如下图,大家肯定注意到了content-type: multipart/form-data; boundary=—-WebKitFormBoundarypxPm5bUFaA8CHOHo。不仅不是Form表单提交,而且和之前讲的上传文件还有区别,即boundary的配置。
requests模拟知乎登录
上一篇文章里的文件上传,post函数里使用的是files参数,通过这个参数来表明使用的是multipart/form-data编码,这里不再是通过files参数传文件,而是传参数,其实本质上一样的,文件内容不就是这参数吗?好,为了测试方便,向 http://httpbin.org/post 发送post请求,代码如下:
import requests
url = "http://httpbin.org/post"fields = {"client_id": "c3cef7c66a1843f8b3a9e6a1e3160e20","grant_type": "password","timestamp": "1527040472416","source": "com.zhihu.web","signature":"66a16483ab16e54c3bb4ef84bf683dd67cadc246","username": "xxxxx@qq.com","password": "xxxxxxxx"
}res = requests.post(url, files=fields)print(res.request.body)
print(res.request.headers)
print(res.text)
从上面代码中可以看到,files参数只不过变成了参数字典。在控制台的输出效果如下:
打印的方式观察的效果不是很好,不如使用http Analyzer
抓取发送的包更加直观。对于http Analyzer的使用在我的书《Python爬虫开发与项目实战》中有讲解。http Analyzer抓到的发送包请求头截图如下:
请求头
payload信息如下,效果已经出来了。
post payload
从上面两张图中,我们发现我们写的程序没有问题,发送的post请求和知乎登录的数据包差别不是很大。
boundary定制
要说和知乎登录请求包还有什么差别,也就是boundary的配置。
知乎登录的类似boundary=—-WebKitFormBoundarypxPm5bUFaA8CHOHo,而我们写的程序为boundary=f30cf72e14254d59a9824e694e10e2c0。肯定有聪明的小伙伴,已经开动脑筋,我们在requests单独配置headers不就可以了?很不幸的告诉大家,这样是不行的,虽然headers改变了,但是post数据中的boundary内容并没有改变呢。这个时候我们要引入帮手requests_toolbelt。
requests_toolbelt
requests_toolbelt是对requests的补充,是一个第三方辅助插件,通过这个插件就可以定制boundary。首先安装requests_toolbelt:
pip3 install requests_toolbelt
定制代码如下:
import requests
from requests_toolbelt import MultipartEncoder
url = "http://httpbin.org/post"
fields = {"client_id": "c3cef7c66a1843f8b3a9e6a1e3160e20","grant_type": "password","timestamp": "1527040472416","source": "com.zhihu.web","signature":"66a16483ab16e54c3bb4ef84bf683dd67cadc246","username": "xxxxx@qq.com","password": "xxxxxxxx"
}m = MultipartEncoder(fields, boundary='----WebKitFormBoundaryWp8R1tWtqL2vhLuG')
res = requests.post(url, headers={'Content-Type': m.content_type}, data=m.to_string())print(res.request.body)
# # 查看请求头
print(res.request.headers)
print(res.text)
发送效果
这次直接使用http analyzer抓包看一下效果。
请求头
post payload
福利大放送
关注公众号:七夜安全博客
- 回复【1】:领取 Python数据分析 教程大礼包
- 回复【2】:领取 Python Flask 全套教程
- 回复【3】:领取 某学院 机器学习 教程
- 回复【4】:领取 爬虫 教程
知识星球已经快40人了,随着人数的增多,价格之后会上涨,越早关注越多优惠。星球的福利有很多:
- 比如上面的教程,已经提前在知识星球中分享
- 可以发表一些问题,大家一块解决
- 我之后写的电子书,录制的教学视频,对于知识星球的朋友都是优惠的(基本上免费)
- 一些节假日会给大家发个红包或者赠书
新版知乎登录之post请求相关推荐
- 新版知乎登录request登录(1)(函数式编程)
新版知乎登录request登录 运行脚本前提 pip3 install requests 更换用户名,密码,直接运行即可,运行时可能需要输入验证码,验证位于当前目录下. 具体代码,及关键步骤注释如下: ...
- 新版知乎登录request登录(2)(类编程)
接上一篇,用类重构了代码,方法是一致的,但是看起来更整洁些. 不多说了,上代码: #! /usr/local/bin python3.6 """ @Time : 2018 ...
- scrapy mysql 模拟登录知乎_Scrapy 模拟登录新版知乎
写这篇文章是因为知乎登录已经改版了,新版登录和老版登录区别还是挺大了,新版登录的 post 请求减少了一些字段的同时新增了一些字段,而且新增的字段如 signature 的值是通过一些算法得到的,比较 ...
- python 知乎登录_python3模拟知乎登录
代码github地址:zhihu 首先分析知乎登录页,一般模拟登录走的都是手机页,比较方便 分析登录过程 为了得到验证码我特意都输错了几次密码,知乎的登录不一定有验证码,所以我们在代码实现的过程中需要 ...
- 知乎登录js逆向及文章爬取js逆向
知乎登录js逆向及文章爬取js逆向 **在此声明:**本文章仅仅用于学习交流,不得用于商业活动. 登录支持账号密码登录及知乎移动端软件扫码登录. 文章爬取是把原文章的原样近似爬取,包括图片,链接,及评 ...
- python爬虫登录教程_Python爬虫之模拟知乎登录的方法教程
前言 对于经常写爬虫的大家都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 "登录" 离不开 HTTP 中的 Cookie 技术. 登录原理 ...
- 知乎python储存_模拟知乎登录——Python3
经常写爬虫的都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 "登录" 离不开 HTTP 中的 Cookie 技术. 登录原理 Cookie ...
- python爬虫模拟与思考_Python爬虫之模拟知乎登录
昨天受邀在 CSDN 微信群做了一次 Python 技术分享,主题是<用Python模拟知乎登录>,效果非常不错,发现越来越多的人加入到了 Python 阵容中. 经常写爬虫的都知道,有些 ...
- 学习笔记 -- 用python中的selenium模拟知乎登录
文章目录 前言 一.模拟知乎登录的准备 二.登录验证码的问题 1.英文验证码 2.中文倒立文字验证码 三.完整代码如下 四.总结 前言 最近在学习python爬虫,为了巩固爬虫的知识,偶尔会写一些简单 ...
最新文章
- python 编码规范 PEP8整理
- Rsync命令参数详解
- java n-ide 支持库,Android N是否要求IDE可以与Java 1.8或更高版本一起运行?
- spring mvc事务没有生效的原因
- 洛谷P1966 火柴排队(逆序对)
- 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
- Unity3D 中的程序后台运行
- php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案
- 【转】如何打包发布基于Qt4 Windows的软件
- linux发行版_2020年最漂亮的7个Linux发行版
- Linux使用CLASS_ATTR创建节点
- 「leetcode」C++题解:226.翻转二叉树,递归法与迭代法详解
- js获取ie版本号与html设置ie文档模式的方法
- codesmith mysql 模板_CodeSmith代码自动生成器 JAVA模版的制作---CodeSmith+MySQL+MyEclipse 10...
- 一看就懂系列:什么是相速度与群速度
- 三顾茅庐:刘备如何面试诸葛亮
- 【电力电子技术DC-DC】Boost升压式变换器Simulink仿真
- 数据可视化之美—BI
- Combo Box Control
- Linux中find命令基本使用方法