需求:爬取国家药品监督总局中基于中华人民共和国化妆品生产许可证相关数据
url:http://scxk.nmpa.gov.cn:81/xk
首页中对应的企业数据是通过ajax请求得到的。
任取一个企业点开它的超链接: http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=ed59438f34ae47e794f4c7ee5137c1f7
再任取一个企业:
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=5eb10afc74a2462c8e86652ec8d90a48
我们会发现,两者仅仅是尾巴后面的id串不同而已!
而id值可以从首页对应的ajax请求到的json串中获取!
域名和id值拼接成一个完整的企业的详情页的url。
但详情页的内容也是动态加载出来的,所以不能通过详情页的url去获取到公司的详情数据。
任取两个公司的ajax请求,观察它们的url:
http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
两个公司的ajax请求的url都是一样的,所不同的是它们的参数id。
如果我们可以获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据的ajax请求的url。
import requests
import json
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63'
}
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()
for dic in json_ids['list']:
id_list.append(dic['ID'])
post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
data = {
'id':id
}
datail_json = requests.post(url=post_url,headers=headers,data=data).json()
all_data_list.append(datail_json)
fp = open('allData.json', 'w', encoding='utf-8')
json.dump(all_data_list,fp = fp,ensure_ascii=False)
print("over!!!")