首先打开国家药品监督局的相应网址
国家药品监督局的相应网址
找到某一家企业点击相应的许可证编号那一个栏目,查看相应的许可证情况
上面对应的内容为我们需要爬取的对应的数据
不确定对上述的网页进行访问的时候,我们能够得到对应的企业名称,许可证编号,发证机关等相应的数据,
这时候我们可以尝试着发一次请求,看看能否得到页面中对应的相应的数据
import requests
import json
url = 'http://scxk.nmpa.gov.cn:81/xk/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
with open('./huazhuangpin.html','w',encoding='utf-8') as fp:
fp.write(page_text)
打开之后发现通过requests爬取到的页面之中并没有对应的企业名称等内容,
说明这些数据并不是通过url获取到的,而是通过别的方式获取到的,很有可能通过阿贾克斯请求到的。
接下来使用相应的抓包工具查看相应的数据
首先我们查看第一个xk/的对应的内容
可以看出xk/返回的正好是对应相应的源代码的数据,也就是我们之前访问对应的url返回的相应的数据。
复制相应的公司,在源代码之中进行相应的搜索
可以发现对应公司的内容在源代码之中并没有能够相应的搜索到,意味着通过这个url请求到的数据包没有搜索到相应的企业信息,爬取的数据为动态加载出来的。
如果在整个界面使用ctrl+f,可以直接搜索整个界面不同组件相应的内容,这样就可以直接搜索到能够获取相应数据的对应组件,进而获取到相应的得到信息的方式
分析第二个相应的页面发现
对应的请求为相应的post请求,需要传入的数据为相应的id的数据,所以只需要从第一个页面提取到的数据之中提取出相应的id数值即可
完整的代码如下
import requests
import json
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
param = {
'method':'getXkzsList'
}
data = {
'on':'true',
'page':'1',
'pageSize':'15',
'productName':'',
'conditionType':'1',
'applyname':'',
'applysn':'',
}
response = requests.post(url=url,params=param,data=data,headers=headers)
page_text = response.json()
#现在page_text为得到的一个对应的json文件
#获取第一个界面相应的json数据,并得到json之中相应的list属性,因为
#list属性之中存放着相应的id的对应的内容
lists = page_text['list']
print('lists = ')
print(lists)
#with open('./huazhuangpin.json','w',encoding='utf-8') as fp:
# fp.write(str(page_text))
for i in range(len(lists)):
currentid = lists[i]['ID']
print(currentid)
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do'
param = {
'method':'getXkzsById'
}
data = {
'id':currentid
}
response = requests.post(url=url,params=param,data=data,headers=headers)
print(response.json())
#获取每一个list之中对应id内容之后,对于第二个界面使用post获取相应的json数据