1:网址 http://125.35.6.84:81/xk/
2:想要获取如下详情信息:
3:分析Ajax请求
首先确认是否请求当前URL会获取首页信息,如获取首页信息,会获得相应企业名称的超链接,获取超链接则可以获取相应详情信息。
可通过对当前URL发送请求进行验证。(笨办法)
还可以通过抓包工具进行验证。判断是和是Ajax请求
查看对当前URL请求的response响应
通过抓包工具【快捷键Ctrl+F】搜索对应企业名称,发现没有(0 of 0),则对此URL进行请求的响应信息不包含详情信息。
由此确定首页信息为动态加载数据。
分析AJAX
查看响应信息
是一个json串,可以通过json校验工具校验
在这里插入图片描述
发现此响应信息为首页的数据信息。(因此确认是AJAX请求)
但是此json串中无详情数据的URL,所以无法进行请求,需要继续分析。
分析两个详情页的URL
http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=ff83aff95c5541cdab5ca6e847514f88
http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=827d2943f8734d5c848336066c97d2b6
发现URL:http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?域名相同
参数id不同,并且ID为对应企业的ID,并且发现与上述json串中ID相同
由此得出,ID值可以从首页对应的Ajax请求的json串中得出
域名和ID值可以拼接处一个完整的对应企业的详情数据的URL.
但是我们要分析详情页的数据是否是动态加载数据。
进行验证
验证发现此详情页信息也是动态加载数据。
再次分析Ajax请求
分析出其URL和参数
其响应数据为json格式,将json串格式化校验
确认此为详情页的详情数据,刚才获取了这个Ajax请求的URL,可以对其发送请求。
分析两个别的详情页的Ajax请求的URL
http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
发现,所有post请求的URL 都一样,ID不一样
如果我们可以批量获取多家企业的ID后,可以使其拼接形成对应企业详情数据Ajax请求的URL。
小技巧(字典迅速匹配引号)
一. 在浏览器中将Request Headers复制到pycharm的py文件中
建议使用Chorme的浏览器复制.
二 .使用快捷键:Ctrl+R 调出正则匹配工具栏
三.按照下图步骤操作:
-
选中需要快速加引号的区域
-
填写正则匹配表达式,
(.*?):(.*)
'$1':'$2',
- 勾选三个选项
- 替换
执行结果如下:
代码如下:
import requests
import json
#UA伪装
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
}
#指定URL
#批量获取不同企业的ID值(ctrl+r正则匹配工具栏)
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
id_list = []#存储企业的ID
all_detal_json = []#存储所有企业的详情数据
#分页处理(获取前6页)
for page in range(1,6):
page = str(page)
data = {#数据处理
'on':'true',
'page':page,#页码
'pageSize':'15',#数据量
'productName':'',
'conditionType':'1',
'applyname':'',
'applysn':'',
}
#发起请求和获取响应数据
json_ids = requests.post(url=url,data=data,headers=headers).json()
for dic in json_ids['list']:
id_list.append(dic['ID'])
# print(id_list)
#获取企业详情数据
#指定URL
post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
#处理参数
for id in id_list:
data = {
'id':id
}
#发起请求,获取响应数据
detal_json = requests.post(url=post_url,data=data).json()
# print(detal_json,"------------ending-------------")
all_detal_json.append(detal_json)
#持久化存储all_detal_json
fp = open('./alldetal,json','w',encoding='utf-8')
json.dump(all_detal_json,fp=fp,ensure_ascii=False)
print("Over!")