新版知乎登录之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请求的更多相关文章
- python爬虫scrapy框架——人工识别知乎登录知乎倒立文字验证码和数字英文验证码
目前知乎使用了点击图中倒立文字的验证码: 用户需要点击图中倒立的文字才能登录. 这个给爬虫带来了一定难度,但并非无法解决,经过一天的耐心查询,终于可以人工识别验证码并达到登录成功状态,下文将和大家一一 ...
- (转)request模拟知乎登录(无验证码机制
原文:http://www.itnose.net/detail/6755805.html import request try: import cookielib #python2版本 except: ...
- request模拟知乎登录(无验证码机制)
import request try: import cookielib #python2版本 except: import http.cookiejar as cookielib #python3版 ...
- 爬虫之爬取B站视频及破解知乎登录方法(进阶)
今日内容概要 爬虫思路之破解知乎登录 爬虫思路之破解红薯网小说 爬取b站视频 Xpath选择器 MongoDB数据库 爬取b站视频 """ 爬取大的视频网站资源的时候,一 ...
- 无法打开登录 'ASPState' 中请求的数据库。登录失败。
问题: 无法打开登录 'ASPState' 中请求的数据库.登录失败.用户 'WH\Administrator' 登录失败. 解决方法: (启动SQL Server Agent服务) 从本系统中找到: ...
- [Python] Python 模拟登录,并请求
Python 模拟登录,并请求 # encoding: utf- import requests import socket import time socket.setdefaulttimeout( ...
- 九、封装登录POST请求、登录后POST请求以及GET请求
一.封装登录后POST请求以及GET请求 /** * 全局运行时环境参数管理器 */ public static Map<String, String> BASE_GLOBAL_MAP; ...
- 七:Spring Security 前后端分离登录,非法请求直接返回 JSON
Spring Security 前后端分离登录,非法请求直接返回 JSON 解决方案 在 Spring Security 中未获认证的请求默认会重定向到登录页,但是在前后端分离的登录中,这个默认行为则 ...
- 使用selenium模拟知网登录
之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...
随机推荐
- twisted高并发库transport函数处理数据包的些许问题
还是在学校时间比较多, 能够把时间更多的花在学习上, 尽管工作对人的提升更大, 但是总是没什么时间学习, 而且工作的气氛总是很紧凑, 忙碌, 少了些许激情吧.适应就好了.延续着之前对twisted高并 ...
- CRM客户关系管理系统(十)
第十章.kingadmin+admin+actions功能开发 10.1. django admin的action 可以自己写个函数执行批量操作 crm/admin.py 后台admin actio ...
- 自制node.js + npm绿色版
自制node.js + npm绿色版 Node.js官网有各平台的安装包下载,不想折腾的可以直接下载安装,下面说下windows平台下如何制作绿色版node,以方便迁移. 获取node.exe下载 ...
- 学习jQuery必须知道的几种常用方法
jQuery事件处理 ready(fn) 代码: $(document).ready(function(){ // Your code here...}): 作用:它可以极大地提高web应用程序的响 ...
- 使用FFmpeg捕获一帧摄像头图像
最近在研究FFmpeg,比较惊讶的是网上一大堆资料都是在说如何从已有的视频中截取一帧图像,却很少说到如何直接从摄像头中捕获一帧图像,其实我一直有个疑问,就是在Linux下,大家是用什么库来采集摄像头的 ...
- Hibernate JPA 动态criteria语句针对null查询条件的特殊处理
最近原Hibernate项目需要添加一个条件,结构有点类似下面的格式,学生和房间是多对一的关系,现在要查询所有没有房间的学生. Class Student{ @ManyToOne Room room; ...
- erlang进程概述
一.概述 与大多数的进程相反,Erlang中的并发很廉价,派生出一个进程就跟面向对象的语言中分配一个对象的开销差不多. 在启动一个复杂的运算时,启动运算.派生进程以及返回结果后,所有进程神奇的烟消云散 ...
- Ubuntu 18.04 启动root账号并授权远程登录
Ubuntu 18.04 刚刚上市2个月,下载安装,尝尝鲜~ 安装界面看上去舒服许多, 安装的速度也较之前17.04 和16.04 都快了许多.抱歉,未截图. Ubuntu 安装完成后默认不启动roo ...
- C# 获取文件下载的各种方法
public class RemoteDownload { public static void DownLoad(string addressUrl,string localName) { //下载 ...
- Eclipse常用插件 + Eclipse快捷键
J2EE开发IDE,常用的有Eclipse.Myeclipse.Intellij IDEA 版本(Luna):http://www.eclipse.org/downloads/ 版本(2015 ...