首页 > 其他分享 >postrelevant

postrelevant

时间:2023-03-31 17:01:13浏览次数:39  
标签:postrelevant Content headers json post data requests

爬虫中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

相关文章