Http请求中Form Data 和 Request Payload两种参数的区别 ?
Ajax Post请求中常用的两种的形式:form data 和 request payload
一、默认的表单方式请求 Form Data
post请求的Content-Type为application/x-www-form-urlencoded(默认的),参数是在请求体中,即上面请求中的Form Data。Content-Type: application/x-www-form-urlencoded; charset=UTF-8
代码格式:
data = {
'i': '\u903B\u8F91\n',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15752746021826',
'sign': 'c62688ce2eab6fd7a95cac50c3e88752',
'ts': '1575274602182',
'bv': '5bc00aa7005fda30bbc3c3735a53d97d',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
二、经浏览器解析后的表单请求 Request Payload
PS: 请求的Content-Type是application/json;charset=UTF-8,而请求表单的参数在Request Payload中。Content-Type: application/json (这里用的是json格式)
代码格式:
payload = '{"operationName":"","query":"","variables":{"ownerId":"5c3f3c415188252b7d0ea40c","size":20,"after":""},"extensions":{"query":{"id":"b158d18c7ce74f0d6d85e73f21e17df6"}}}'
二者之间的区别 ?
post请求,如果表单参数是在请求体中,也是以key1=value1&key2=value2的形式在请求体中。
通过chrome的开发者工具可以看到,比如:
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
1、如果一个请求的Content-Type设置为
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
那么这个Post请求会被认为是Http Post表单请求,请求主体也将以一个标准的键值对和&的str形式出现。这种方式是HTML表单默认的设置,对现如今的网络请求构造是很常见的。
2、Request payload形式的POST请求,网站为了方便阅读,使用了Json这样的数据格式,请求的方式为
Content-Type: application/json 或者指定charset=UTF-8。
- 实战
使用requests模块post payload请求
在抓取个人数据的时候发现get形式获取不到数据,通过分析网站结构发现需要Post请求的json格式数据;进而发现其使用的Post格式并不是Form Data 而是Request Payload
第一步:先请求拿到数据在说
import requests
import json
# 首页地址
url = "https://web-api.juejin.im/query"
# 伪装成浏览器
headers = {
'X-Legacy-Device-Id': '1574318487465',
'Origin': 'https://juejin.im',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
'X-Legacy-Token': 'eyJhY2Nlc3NfdG9rZW4iOiJBNVNuRUNPb1Jad0doWm1wIiwicmVmcmVzaF90b2tlbiI6IkpuVkFoZFozdjNFdDZMOFMiLCJ0b2tlbl90eXBlIjoibWFjIiwiZXhwaXJlX2luIjoyNTkyMDAwfQ==',
'Content-Type': 'application/json',
'Referer': 'https://juejin.im/user/3650034335487975',
'X-Legacy-Uid': '5dd631975188254e310b4cbb',
}
payload = '{"operationName":"","query":"","variables":{"ownerId":"5c3f3c415188252b7d0ea40c","size":20,"after":""},"extensions":{"query":{"id":"b158d18c7ce74f0d6d85e73f21e17df6"}}}'
# 发起网络请求,获取到返回的html
result = requests.post(url=url, headers=headers, data=payload).content.decode('utf-8')
print(result)
这时候已经可以拿到payload表单形式的json数据了,因为考虑到是json格式的数据,不方便我们进行数据处理!接下来咱们先转换一下格式!这里转换成字典格式。
result=json.loads(result)
result_list=result['data']['ownActivityFeed']['items']['edges']
print(result_list)
这个时候已经成功的将数据格式进行转换,之后并通过一直获取键值对的形式拿到网站所包含的数据;数据类型的格式为列表, 再次深入获取
for item in result_list:
# # 用户名
node_list=item['node']
user_targets_content=node_list['targets']
for item_name_list in user_targets_content:
try:
user=item_name_list['user']
user_name=user['username']
user_content=item_name_list['content']
except:
continue
print('*' * 30, '\n', user_name, user_content, '\n', '*' * 30)
with open('lg_Tony.txt','a') as file:
file.write(user_name+'\t\t'+user_content+'\n\n')
考虑到只是获取简单的界面内容,所以这里只用了txt文件进行保存。