药监总局信息
药监总局url:
http://scxk.nmpa.gov.cn:81/xk/
想要爬取到页面上每一个公司的具体信息,先信息搜集
可以看到,get请求到的数据包中是没有这些具体信息的,那些信息很可能是动态加载出来的,并不能直接从url中请求到,可能是由Ajax对应的请求请求到。
那么就查找Ajax的包
果然发现了json数据,格式化校验后发现公司的信息
又发现每家公司都会有一个id,这个id对应的就是自己公司的信息,那么id就可以从对应Ajax请求到的json串中获取,然后将域名和id拼接起来
import requests
import json
if __name__ == '__main__':
# 1.批量获取不同企业id值
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
data = {
'on': 'true',
'page': '1',
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': ''
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
}
json_ids = requests.post(url=url, headers=headers, data=data).json() # 将发请求与获取数据合在一起
id_list = [] # 企业id
all_data_list = []
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:
datas = {
'id': id
}
details_json = requests.post(url=post_url, headers=headers, data=datas).json()
all_data_list.append(details_json)
# print(details_json)
# 持久化存储
fp = open('./alldata.json', 'w', encoding='utf-8')
json.dump(all_data_list, fp=fp, ensure_ascii=False)
在获取到json数据后,利用遍历的方法通过列表将list存储起来,然后也是用遍历的方法将该列表转换为字典,并一一加载。
以上的操作,只能爬取一页的数据,如果想要爬取所有的,还需要进行分页操作
import requests
import json
if __name__ == '__main__':
# 1.批量获取不同企业id值
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 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() # 将发请求与获取数据合在一起
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:
datas = {
'id': id
}
details_json = requests.post(url=post_url, headers=headers, data=datas).json()
all_data_list.append(details_json)
# print(details_json)
# 持久化存储
fp = open('./alldatas.json', 'w', encoding='utf-8')
json.dump(all_data_list, fp=fp, ensure_ascii=False)
用一个for循环来实现批量获取的页数内容,由于列表只需要定义一个,所以要将id_list
和all_data_list
放在for循环外面,获取数据是每页获取一次,必须放在for循环内。