您的位置: 网站首页> requests爬虫> 当前文章

requests的post请求提交表单的2种方式

老董2021-11-11162围观,109赞

  POST请求在上网中也很常见,诸如注册登录、购物提交等。我们可以写1个最简单的浏览器表单示例。

<form action="http://xxxxxxx" method="POST">
账号:<input type="text" name="user" />
密码:<input type="text" name="pwd" />
   <input type="submit" />
</form>

  上述代码保存为html文件,在浏览器上打开效果如下图,在点击提交按钮时浏览器默认会在请求头加Content-Type: application/x-www-form-urlencoded。

  HTTP协议中没有规定post提交数据必须使用什么数据格式,服务端根据请求头中的Content-Type字段来获取提交方式然后对数据进行解析。在html中的form表单中enctype属性有3种设置方式:

 <form action="url地址" enctype="application/x-www-form-urlencoded" method="POST">
<form action="url地址" enctype="multipart/form-data" method="POST"> 上传文件的设置
<form action="url地址" enctype="text/plain" method="POST">

  post请求虽然是提交数据到服务器,但是服务器通常也会返回1个页面!其返回的内容一般告诉你提交数据的结果或者提交了哪些数据。比如在某平台post数据后给的返回示例:

  参照官方文档案例,本文使用requests来post表单数据(分为字典形式与元组形式传参)。

  PS:具体到不同的网站不同的接口,post的内容也是各不相同,网站注册可能就post账号和密码即可,点击购物可能要post价格、下单日期、数量、颜色、型号等,无论参数多少,其post的本质是不变的。需要post哪些参数要视网站而定!(现实中经常需要抓包才能看到post了哪些参数)

  1、以字典形式提交post数据

  requests提交Form表单,一般存在于网站的登录,用来提交用户名和密码。以 http://httpbin.org/post 为例,在requests中,以form表单形式发 送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

  示例代码如下:

# -*- coding: utf-8 -*-
my_header = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44',
'Content-Type':'application/x-www-form-urlencoded'
}

def post_html(url,key_value,retry=2):
	try:
		r = requests.post(url=url,headers=my_header, data = key_value,timeout=10)
	except requests.exceptions.RequestException as e:
		print('请求失败',e)
		time.sleep(10)
		if retry > 0:
			get_html(url, retry - 1)
	else:
		html = r.text
		return html

url = 'http://httpbin.org/post'
key_value = {'wd': 'www.python66.com'}
html = post_html(url,key_value)
print(html)
{
  "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 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44", 
    "X-Amzn-Trace-Id": "Root=1-6191f777-6b4ec1565cb4960c5de7be80"
  }, 
  "json": null, 
  "origin": "60.247.59.67", 
  "url": "http://httpbin.org/post"
}

  2、以元组形式提交post数据

  除了上述传入字典之外。也可以为data参数传入一个元组列表,在表单中多个元素使用同一 key 的时候,这种方式尤其有效。

# -*- coding: utf-8 -*-
my_header = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44',
'Content-Type':'application/x-www-form-urlencoded'
}
def post_html(url,key_value,retry=2):
	try:
		r = requests.post(url=url,headers=my_header, data = key_value,timeout=10)
	except requests.exceptions.RequestException as e:
		print('请求失败',e)
		time.sleep(10)
		if retry > 0:
			get_html(url, retry - 1)
	else:
		html = r.text
		return html

url = 'http://httpbin.org/post'
key_value = payload = (('key1', 'value1'), ('key1', 'value2'))
html = post_html(url,key_value)
print(html)
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": [
      "value1", 
      "value2"
    ]
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44", 
    "X-Amzn-Trace-Id": "Root=1-6191f863-1441c7fa3c5f49a411189288"
  }, 
  "json": null, 
  "origin": "60.247.59.67", 
  "url": "http://httpbin.org/post"
}


很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    requests的post请求提交表单的2种方式文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 博主微信:a772483200