您的位置: 网站首页> requests爬虫> 当前文章
requests的post请求提交表单的2种方式
老董-我爱我家房产SEO2021-11-11183围观,112赞
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。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群
相关文章
文章评论
-
requests的post请求提交表单的2种方式文章写得不错,值得赞赏
站点信息
- 网站程序:Laravel
- 客服微信:a772483200