前言

在上一篇文章中给大家讲解了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请求相关推荐

  1. 新版知乎登录request登录(1)(函数式编程)

    新版知乎登录request登录 运行脚本前提 pip3 install requests 更换用户名,密码,直接运行即可,运行时可能需要输入验证码,验证位于当前目录下. 具体代码,及关键步骤注释如下: ...

  2. 新版知乎登录request登录(2)(类编程)

    接上一篇,用类重构了代码,方法是一致的,但是看起来更整洁些. 不多说了,上代码: #! /usr/local/bin python3.6 """ @Time : 2018 ...

  3. scrapy mysql 模拟登录知乎_Scrapy 模拟登录新版知乎

    写这篇文章是因为知乎登录已经改版了,新版登录和老版登录区别还是挺大了,新版登录的 post 请求减少了一些字段的同时新增了一些字段,而且新增的字段如 signature 的值是通过一些算法得到的,比较 ...

  4. python 知乎登录_python3模拟知乎登录

    代码github地址:zhihu 首先分析知乎登录页,一般模拟登录走的都是手机页,比较方便 分析登录过程 为了得到验证码我特意都输错了几次密码,知乎的登录不一定有验证码,所以我们在代码实现的过程中需要 ...

  5. 知乎登录js逆向及文章爬取js逆向

    知乎登录js逆向及文章爬取js逆向 **在此声明:**本文章仅仅用于学习交流,不得用于商业活动. 登录支持账号密码登录及知乎移动端软件扫码登录. 文章爬取是把原文章的原样近似爬取,包括图片,链接,及评 ...

  6. python爬虫登录教程_Python爬虫之模拟知乎登录的方法教程

    前言 对于经常写爬虫的大家都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 "登录" 离不开 HTTP 中的 Cookie 技术. 登录原理 ...

  7. 知乎python储存_模拟知乎登录——Python3

    经常写爬虫的都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 "登录" 离不开 HTTP 中的 Cookie 技术. 登录原理 Cookie ...

  8. python爬虫模拟与思考_Python爬虫之模拟知乎登录

    昨天受邀在 CSDN 微信群做了一次 Python 技术分享,主题是<用Python模拟知乎登录>,效果非常不错,发现越来越多的人加入到了 Python 阵容中. 经常写爬虫的都知道,有些 ...

  9. 学习笔记 -- 用python中的selenium模拟知乎登录

    文章目录 前言 一.模拟知乎登录的准备 二.登录验证码的问题 1.英文验证码 2.中文倒立文字验证码 三.完整代码如下 四.总结 前言 最近在学习python爬虫,为了巩固爬虫的知识,偶尔会写一些简单 ...

最新文章

  1. python 编码规范 PEP8整理
  2. Rsync命令参数详解
  3. java n-ide 支持库,Android N是否要求IDE可以与Java 1.8或更高版本一起运行?
  4. spring mvc事务没有生效的原因
  5. 洛谷P1966 火柴排队(逆序对)
  6. 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
  7. Unity3D 中的程序后台运行
  8. php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案
  9. 【转】如何打包发布基于Qt4 Windows的软件
  10. linux发行版_2020年最漂亮的7个Linux发行版
  11. Linux使用CLASS_ATTR创建节点
  12. 「leetcode」C++题解:226.翻转二叉树,递归法与迭代法详解
  13. js获取ie版本号与html设置ie文档模式的方法
  14. codesmith mysql 模板_CodeSmith代码自动生成器 JAVA模版的制作---CodeSmith+MySQL+MyEclipse 10...
  15. 一看就懂系列:什么是相速度与群速度
  16. 三顾茅庐:刘备如何面试诸葛亮
  17. 【电力电子技术DC-DC】Boost升压式变换器Simulink仿真
  18. 数据可视化之美—BI
  19. Combo Box Control
  20. Linux中find命令基本使用方法

热门文章

  1. 以system用户登录win7修改删除注册表项的方法
  2. Andrew Ng吴恩达深度学习Course_2笔记
  3. 一次关于youtube逆向分析协议
  4. SFP 与SFP+ 的区别
  5. WORD中批量修改表格的格式
  6. 解密Globeimposter-Alpha865qqz勒索病毒:如何恢复被加密的数据文件?
  7. Python 随机数生成
  8. Linux系统su命令的详细用法
  9. 第七十七章 SQL函数 LENGTH
  10. 情迁红包配合情迁QQ机器人新版作为插件加载的使用教程