HTTP协议中没有规定post提交的数据必须使用什么编码方式,服务端根据请求头中的Content-Type字段来获取编码方式,再对数据进行解析。具体的编码方式包括如下:

- application/x-www-form-urlencoded # 以form表单形式提交数据,最常见最熟悉

- application/json # 以json串提交数据。

- multipart/form-data # 上传文件

下面使用requests来发送上述三种编码的POST请求。

1、提交Form表单

requests提交Form表单,一般存在于网站的登录,用来提交用户名和密码。以 http://httpbin.org/post 为例,在requests中,以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。(httpbin.org 网站可以显示提交请求的内容,输出的”Content-Type”:”application/x-www-form-urlencoded”,证明这是提交Form的方式。)代码如下:

# -*- coding: utf-8 -*-

import requests

def get_html(url, key_value, retry=2):

try:

r = requests.post(url=url, headers=headers, data=key_value, timeout=5)

except Exception as e:

print(e)

if retry > 0:

get_html(url, retry - 1)

else:

page = r.text

return page

if __name__ == "__main__":

# 自定义请求头信息

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',

}

url = 'http://httpbin.org/post'

kw = {'wd': 'www.python66.com'}

html = get_html(url, kw)

print(html)

D:python3installpython.exe D:/python/py3script/test.py

{

"args": {},

"data": "",

"files": {},

"form": {

"wd": "www.python66.com"

},

"headers": {

"Accept": "*/*",

"Accept-Encoding": "gzip, deflate",

"Content-Length": "19",

"Content-Type": "application/x-www-form-urlencoded",

"Host": "httpbin.org",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"

},

"json": null,

"origin": "223.72.81.198, 223.72.81.198",

"url": "https://httpbin.org/post"

}

Process finished with exit code 0

2、提交json串

对于提交json串(浏览器中抓包显示payload),主要是用于发送ajax请求中,动态加载数据。

可以用json.dumps()对dict进行编码,可以使用json参数直接传递,然后它就会被自动编码,在请求头中也不用显示声明 这是 2.4.2 版的新加功能。代码如下:

# -*- coding: utf-8 -*-

import requests

import json

def get_html(url, key_value, retry=2):

try:

r = requests.post(url=url, headers=headers, data=key_value, timeout=5)

except Exception as e:

print(e)

if retry > 0:

get_html(url, retry - 1)

else:

page = r.text

return page

def get_html_json(url, key_value, retry=2):

try:

r = requests.post(url=url, headers=headers, json=key_value, timeout=5)

except Exception as e:

print(e)

if retry > 0:

get_html_json(url, retry - 1)

else:

page = r.text

return page

if __name__ == "__main__":

# 自定义请求头信息

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',

'Content-Type':'application/json; charset=UTF-8',

}

url = 'https://api.xxxx.com/xxx/xxx'

kw = {'domain': 'www.python66.com'}

# json.dumps

html = get_html(url, json.dumps(kw))

# 传递json参数

html_json = get_html_json(url,kw)

3.上传文件:

上传文件在爬虫中使用的很少。Content-Type类型为multipart/form-data,以multipart形式发送post请求,只需将一文件传给 requests.post() 的 files参数即可。还是以 http://httpbin.org/post 为例,代码如下:

# -*- coding: utf-8 -*-

import requests

def get_html(url, key_value, retry=2):

try:

r = requests.post(url=url, headers=headers, data=key_value, timeout=5)

except Exception as e:

print(e)

if retry > 0:

get_html(url, retry - 1)

else:

page = r.text

return page

if __name__ == "__main__":

# 自定义请求头信息

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',

}

url = 'http://httpbin.org/post'

files = {'file': open('ajax.png', 'rb')}

html = get_html(url, files)

print(html)

D:python3installpython.exe D:/python/py3script/test.py

{

"args": {},

"data": "",

"files": {

"file": "data:application/octet-stream;base64,...太长..省略..."

},

"form": {},

"headers": {

"Accept": "*/*",

"Accept-Encoding": "gzip, deflate",

"Content-Length": "68870",

"Content-Type": "multipart/form-data; boundary=66f5b203f18f79960ac438c59af481b0",

"Host": "httpbin.org",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"

},

"json": null,

"origin": "223.72.72.67, 223.72.72.67",

"url": "https://httpbin.org/post"

}

Process finished with exit code 0

警告

建议用二进制模式(binary mode)打开文件,因为 Requests 可能会试图为你提供 Content-Length header,在它这样做的时候,这个值会被设为文件的字节数(bytes)。如果用文本模式(text mode)打开文件,就可能会发生错误。

python post 请求json文件_requests的post请求提交表单、json串和文件数据讲解相关推荐

  1. ajax使用pur请求怎么传参,jQuery使用ajaxSubmit()提交表单示例

    ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先引入这个插件.如下所示: 复制代码 代码如下: 那么,如何通过ajaxSubmit ...

  2. php 利用fsockopen GET/POST 提交表单及上传文件

    1.GET get.php [php] view plaincopy <?php $host = 'demo.fdipzone.com'; $port = 80; $errno = ''; $e ...

  3. php curl 发送checkbox,使用curl 提交表单(多维数组+文件)数据到服务器的有关问题...

    使用curl 提交表单(多维数组+文件)数据到服务器的问题 我在本地搭了一个测试服务器,Apache+PHP,想使用curl自动提交表单数据到远程服务器. 远程服务器表单有两项数据需要提交: 1.in ...

  4. python网页提交表单_使用Python中的POST请求通过网站表单上传基本文件

    我尝试使用Python和HTTP请求在一个随机的网站上上传一个文件.为此,我使用名为Requests的便利库. 根据the documentation,以及StackOverflow here和the ...

  5. Android Okhttp3的使用(很全面,包含Post提交字符串、键值对、表单、上传文件、无参请求和Get有参无参请求,还有自动添加token)

    Okhttp简介 okhttp是现代化应用程序的网络通信的方式.它用来帮助程序交换数据和媒体信息,使用okhttp可以让你的程序加载物料(翻译为服务器数据更合适在)更加高效.更节省网络带宽. okht ...

  6. 搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

    调试Django框架写的服务时,需要模拟客户端发送POST请求,然而浏览器只能模拟简单的GET请求(将参数写在url内),网上搜索得到了HttpRequester这一firefox插件,完美的实现了模 ...

  7. Form表单 JSON Content-type解析

    1 表单Form概述 在Form表单中,参数一般有:action 表单提交的urlmethod 提交方式:post getname 表单的属性名enctype 提交数据的编码格式 2 常见的编码方式与 ...

  8. ajax c 提交form,使用ajax提交form表单,包括ajax文件上传

    前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },"json"); 又或者是这样的aja ...

  9. AJAX 提交表单以及文件上传

    本文转自:https://www.cnblogs.com/zhuxiaojie/p/4783939.html#autoid-0-0-0 作者:朱小杰 前言 使用ajax请求数据,很多人都会,比如说: ...

  10. 使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html...

    使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){... },&quo ...

最新文章

  1. JDOM是JAVA中最常用的一种解析XML的工具
  2. php 反序列化漏洞简介
  3. android 字体颜色选择,Android中颜色选择器和改变字体颜色的实例教程
  4. OpenFeign封装为springboot starter
  5. C 中细节问题的试题
  6. 缠中说禅股票交易系统图解 z
  7. 蓝牙BLE芯片PHY6222之SPI驱动ST7789
  8. 三维空间的位姿描述和齐次变换
  9. 数据结构——基数排序(经典以空间换时间案例)
  10. 介孔二氧化硅纳米粒子应用在组织工程
  11. 8个优秀的预训练模型,帮助您开始使用自然语言处理(NLP)
  12. 百度技术:“App 优化网络,先从 HTTPDNS 开始” | 原理到实战
  13. 求100到1000内水仙花数及个数
  14. 太和二中计算机考试,太和二中网上阅卷系统|翰林金榜太和二中查分系统 网页版_最火手机站...
  15. To the MAX(蓝书刷题记录)
  16. mysql多列索引(组合索引)特点和使用场景
  17. Elasticsearch 6 Mapping设置
  18. 怎么样才能让自己自律起来_怎样才能让自己真正的自律起来?
  19. 雨流计数法及matlab代码【转载】
  20. 桌面窗口小部件添加List

热门文章

  1. 数据大屏可视化-highcharts-3D实心饼图
  2. LeetCode 1374.生成每种字符都是奇数个的字符串
  3. 落地DevOps,探索高效研发运营一体化解决方案
  4. Samba实现Linux与windows文件共享
  5. python三国演义人物 统计分析_Python统计三国演义主要人物出场次数
  6. python之numpy之axis=1和axis=0
  7. 日用品电商销售数据分析
  8. oracle11g数据库导入导出
  9. 【毕业设计】远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网
  10. Srt字幕文件只保留文字