Python爬虫学习第二章-6-使用requests模块爬取国家药品监督管理总局中居于中国化妆品生产许可证相关数据
这一节是使用requests模块爬取国家药品监督管理总局中居于中国化妆品生产许可证相关数据
数据是动态加载出来的(network刷新界面后中看ALL->找特定的包->看response,可以复制公司的名字,ctrl+F检测response中是否有这个名字,没有的话则说明此页面肯定是动态加载出来的),表示在首页中对应的企业信息数据是通过ajax动态请求到的。看下面几个url:
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=a9a5c49cf1d149d18ea8275e4327e226 a9a5c49cf1d149d18ea8275e4327e226
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=ff83aff95c5541cdab5ca6e847514f88 ff83aff95c5541cdab5ca6e847514f88
通过对详情页url的观察,发现url中域名是一样的,只有id值不一样,而id值可以从首页对应的Ajax请求到的json串中获取,所以可以用域名和获取的id值拼接成一个完整的详情页的url。
通过判断页面是否是动态加载出来的方法可以判断,详情页中的数据也是动态加载出来的,也就是说,不能通过域名+id值得方式发起请求。还要继续找请求方式,最后发现,详情页中的数据也是通过ajax的方式动态加载出来的。
http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
观察后发现:所有的post请求的url都是一样的,只有参数id值是不同的,如果能批量获取多家企业的id,就能将id和url形成一个完整的详情页对应详细数据的ajax请求的url。
批量获取多家id:从获取的json串中获取。利用获取到的id值和上边的url就可以发起请求,从而获取数据。
实现代码:
import requests
import json
if __name__=="__main__":
#批量获取不同企业的id值
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
# 进行UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
id_list = [] # 存储企业的id
all_data_list = [] # 存储所有企业的详情数据
#参数的封装 根据最后一段进行参数处理
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,headers=headers,data=data).json() #从network的response也能看到,结果是字典类型
#从字典类型json_ids获取id值
for dic in json_ids['list']:
id_list.append(dic['ID'])
#结合id值和http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById获取企业详情数据
post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
data = {
'id':id
}
#每次得到新的url都要发起请求
detail_json = requests.post(url=post_url,headers =headers,data = data).json()
all_data_list.append(detail_json)
#print(detail_json,'----------ending----------------')
#持久化存储
fp = open('./alldata.json','w',encoding='utf-8')
json.dump(all_data_list,fp=fp,ensure_ascii=False) # 存到json文件中
print('over')