python爬虫(国家药品监督总局化妆品生产许可证相关信息)+Ajax请求分析(动态加载数据)

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. 填写正则匹配表达式,

(.*?):(.*)
'$1':'$2',
  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!")

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值