由于学习爬虫是野路子出家,在以往的接口调试中,都是用请求头中的字段去胡乱匹配,也不知个所以然,往往都是靠猜最后请求成功的,耗时很久。今天学习了一下接口校验的方法,特此做笔记记录一下。
以http://www.whggzy.com/front/search/category,post请求为例,直接requests.post()会返回500,提示系统出错,请稍后重试
流程如下:
第一步:选取常用请求头字段(User-Agent和防盗链Referer)
headers = {
'Referer': 'http://www.whggzy.com/PoliciesAndRegulations/index.html?utm=sites_group_front.2ef5001f.0.0.109957c0c4d011edb1ab2bbc0ab14525',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
第二步:通过路径在XHR断点中进行校验:赋值路径/front/search/category,在网页点击source(源代码),右侧找到XHR/fetch Breakpoints(XHR/提取断点)点击添加路径,然后重新刷新网页
刷新网页后,由于作用域没有路径相关的关键字,所以点击下一步一步步调试
直到看到关键字路径/front/search/category,然后点击requestHeaders查看请求头校验,同时可以看到options中data格式为字符串格式,所以不能直接data不能写为常用的json格式。
将验证字段添加到请求头中
headers = {
'Accept': "*/*",
'Content-Type': "application/json",
'X-Requested-With': "XMLHttpRequest",
'Referer': 'http://www.whggzy.com/PoliciesAndRegulations/index.html?utm=sites_group_front.2ef5001f.0.0.109957c0c4d011edb1ab2bbc0ab14525',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
第三步:确认data格式:由于data格式为字符串格式,所以可以用json.dumps将data解析为json字符串,或者直接改写data为字符串格式:
data = '{\"utm\":\"sites_group_front.2ef5001f.0.0.109957c0c4d011edb1ab2bbc0ab14525\",\"categoryCode\":\"GovernmentProcurement\",\"pageSize\":15,\"pageNo\":1}'
完整代码:
import json
import requests
url = 'http://www.whggzy.com/front/search/category'
headers = {
'Accept': "*/*",
'Content-Type': "application/json",
'X-Requested-With': "XMLHttpRequest",
'Referer': 'http://www.whggzy.com/PoliciesAndRegulations/index.html?utm=sites_group_front.2ef5001f.0.0.109957c0c4d011edb1ab2bbc0ab14525',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
data = {
'categoryCode': "GovernmentProcurement",
'pageNo': 1,
'pageSize': 15,
'utm': "sites_group_front.2ef5001f.0.0.109957c0c4d011edb1ab2bbc0ab14525"
}
r = requests.post(url, headers=headers, data=json.dumps(data))
# data = "{\"utm\":\"sites_group_front.2ef5001f.0.0.109957c0c4d011edb1ab2bbc0ab14525\",\"categoryCode\":\"GovernmentProcurement\",\"pageSize\":15,\"pageNo\":1}"
# r = requests.post(url, headers=headers, data=data)
print(r.status_code)
print(r.text)