欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python爬虫处理奇葩的请求参数payload

程序员文章站 2022-09-04 20:24:50
偶然的发现某网站,采用的是post请求,然后打开f12调试查看: 它提交的参数并不是我们熟悉的formdata类型,而是payload,这种是怎么回事呢,先了解下什么是payloadRequest Payload我们都知道,前端与后端交互,一般有几种模式,且通过字段... ......

引言

偶然的发现某网站,采用的是post请求,然后打开f12调试查看:

 

 

Python爬虫处理奇葩的请求参数payload

 

 

 

它提交的参数并不是我们熟悉的formdata类型,而是payload,这种是怎么回事呢,先了解下什么是payload

 

request payload

 

我们都知道,前端与后端交互,一般有几种模式,且通过字段content-type区分

 

content-type:

  • application/x-www-form-urlencoded
  • application/json
  • multipart/form-data

 

写过后端接口的朋友对这个应该不陌生

写过前端的朋友,看这个,你应该也不陌生

<form action="http://www.example.com" method="post" enctype="application/x-www-form-urlencoded">

application/x-www-form-urlencoded 

这就是默认的模式,也就是我们平时写的请求参数是字典格式,然后在发送请求时会把字典的键值转为key1=value1&key2=value2...等等的

 

application/json 

这个看名字就知道,就是json格式,也就是我们遇到的那种ajax异步请求的,带的参数就是字典的样子,只是被转成了字符串

 

multipart/form-data

这种很少见,它也是上传文件需要用的模式,这个前端的朋友应该更了解一点,如果传递的不是文件的话,这种模式就是本篇文章要说的request payload类型

 

payload有哪些形式提现

 

第一种

这种我见过的最多的就是下面这种:

 

{"token":"","pn":20,"rn":10,"sdt":"","edt":"","wd":"","inc_wd":"","exc_wd":"","fields":"title","cnum":"001;002;003;004;005;006;007;008;009;010","sort":"{\"showdate\":\"0\"}","ssort":"title","cl":200,"terminal":"","condition":[{"fieldname":"categorynum","islike":true,"liketype":2,"equal":"001001"}],"time":null,"highlights":"title","statistics":null,"unioncondition":null,"accuracy":"100","noparticiple":"0","searchrange":null,"isbusiness":1}

这个你别看着简单,注意里面有两个参数,null,false,true,当你用json提交的话,是无法正常返回值的,因为什么,python里,没有null和false的关键词,只有none和false,这个我暂且对这种命名为编程语言语法隔离(我自己取的啊,很随意)

 

这种怎么办,把null改为none,false改为false,true改为true,然后在发送请求的时候把参数用json.dumps()一下转为字符串,在提交请求的时候,none会自动变成null,false和true也相同,这样就和所需请求格式符合,就可以正常返回值

 

第二种

 

url是https://xxxx/trueloreajax/truelore.web.webui.ajaxhelper,truelore.web.webui.ashx

 

["truelore.web.webui.webajaxservice","getpagexmxx",[45,15,1,130,false,"xxbt","","fbqssj desc"],null,null]1584152836329

 

这种,就非常奇葩了,这也是文章开头就说了下的格式

 

你乍一看,它是个列表,尾部看长度大胆猜测是个时间戳,你把时间戳删掉然后用列表去请求,

 

headers = {
     'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/75.0.3738.0 safari/537.36 edg/75.0.107.0'
}

url = '' #保密

data = ["truelore.web.webui.webajaxservice","getpagexmxx",[45,15,1,130,false,"xxbt","","fbqssj desc"]

req = requests.post(url, headers=headers, data=data, verify=false)
res = req.content.decode('utf-8')
print(res)

  

一运行,当场懵逼,我第一次遇到这个的时候也是这样,我还没运行我就抱着忐忑的心态,因为我就预感不行,参数怎么能是列表形式呢,运行的结果肯定是不行的,得不到结果

 

怎么办呢?

 

我想了下,在遇到最多的ajax时都可以是json字符串,json本质上就是个字符串,那么也就是说,请求参数其实可以是字符串的,列表不行,我就直接转为字符串看看

 

headers = {
   'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/75.0.3738.0 safari/537.36 edg/75.0.107.0'
}

url ='' # 保密

data = ["truelore.web.webui.webajaxservice","getpagexmxx",[45,15,1,130,false,"xxbt","","fbqssj desc"],null,null]

req = requests.post(url, headers=headers, data=str(data), verify=false)
res = req.content.decode('utf-8')
print(res)

  

运行发现还是不行,事后我才发现,其实我已经离成功很近了,我又去研究这种到底是咋回事,全网搜有关truelore的资料,已经url是truelore.web.webui.ajaxhelper,truelore.web.webui.ashx相关的东西,找了半天,有了大概的了解后,我突然想起,我的请求头好像只有个ua,我把浏览器上的请求头全部带上看看,

 

发现他妈的居然就可以了,最后根据筛选发现,请求头必须得有ajax-method': 'ajaxmethodfactory才行,最后得出如下结果:

 

headers = {
    'ajax-method': 'ajaxmethodfactory',  # 这个很重要
    'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/75.0.3738.0 safari/537.36 edg/75.0.107.0'
}

url = 'https://xxxxxx/trueloreajax/truelore.web.webui.ajaxhelper,truelore.web.webui.ashx'

data = '["truelore.web.webui.webajaxservice","getpagexmxx",[45,15,1,130,false,"xxbt","","fbqssj desc"],null,null]'

req = requests.post(url, headers=headers, data=data, verify=false)
res = req.content.decode('utf-8')
print(res)

  

运行结果:

Python爬虫处理奇葩的请求参数payload

 

 

 

成功,ojbk

 

payload还有没有其他的形式,后续遇到再补充

 

 

解决了就很简单,没解决就很焦灼,就会一直在想要怎么去拼凑出这种格式,其实,多想想,多查查,遇到问题自己解决,尽量别去问别人