爬虫中post相关
HTTP数据传输
先来看看 HTTP 是如何传输表单数据的。HTTP 是以ASCII 码传输的,建立在TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分: 状态行、请求头、消息主体 。类似于下面这样:
<method> <url> <version>
<headers>
<entity-body>
# 例如:
# 请求行
POST /wp-admin/admin-ajax.php HTTP/1.1
# 下面都是请求头
Host: zwjjiaozhu.top
Content-Length: 69
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
# 下面是消息主体内容
action=user_login&username=%E5%8F%91&password=+%E5%8F%91&rememberme=1
请求头中有User-Agent,如果请求中headers中没有可能会被认为不合理请求
请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。post 方法中有四种编码方式。
POST 提交是在消息主体中的。
1.application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单
, 如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据 。首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。
import requests
import json
url="http://httpbin.org/post"
data={
"name":"batman",
"age":"14"
}
headers={
"Content-type":"application/x-www-form-urlencoded"
}
rs=requests.post(url,headers=headers,data=data)
re=json.loads(rs.text)
print(re)
2.multipart/form-data
这种编码方式,通常是用在客户端向服务端传送大文件数据,如:图片或者文件
。首先来解释下什么它的编码方式,首先会生成一个很长的 boundary
字符串分界线,表明下面的都是表单内容,然后紧接着跟的是表单中的第一个键值对中的名称,而后一个换行,跟着值。然后再生成一个 boundary
字符串分界线,用于分割不同的键值。之后就重复以上操作,详细的流程请看下方的例子。
import requests
import json
from requests_toolbelt import MultipartEncoder
m = MultipartEncoder(
fields={'field0': 'value1', 'field1': 'value2', 'field2': ('filename', open('D:\py\pycharge\pycrawlertest\data.txt', 'rb'), 'text/plain')}
)
content = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type}).text
print(content)
print(m.content_type)
结果是把文件也发送了
{
"args": {},
"data": "",
"files": {
"field2": "6"
},
"form": {
"field0": "value1",
"field1": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "359",
"Content-Type": "multipart/form-data; boundary=4d1205804b084ac3aa0e96ce62e71c11",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.28.1",
"X-Amzn-Trace-Id": "Root=1-6426981d-6b8821337ba419000e10c37d"
},
"json": null,
"origin": "113.57.237.76",
"url": "http://httpbin.org/post"
}
3.application/json
设置 header 中 Content-type
,就告诉服务端数据以 Json 字符串的形式存在,相应的就用 Json 的方法解码数据即可。
import requests
import json
url="http://httpbin.org/post"
p_data={
"name":"batman",
"love":"catgirl"
}
headers={
'Content-Type': "application/json"
}
rs=requests.post(url,headers=headers,json=json.dumps(p_data))
print(rs.content)
返回是一个json数据,传输也是json
4.text/xml
import requests
# from requests_toolbelt import MultipartEncoder
p_data = """
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
"""
content = requests.post(url='http://httpbin.org/post',data=p_data,headers={'Content-Type':'text/xml'}).text
print(content)
标签:postrelevant,Content,headers,json,post,data,requests
From: https://www.cnblogs.com/minornerstop/p/17276787.html