提前准备工作
一.http://scxk.nmpa.gov.cn:81/xk/
二.要求:抓取每一家企业的企业详情数据
思路
1.在对一个陌生的网站进行数据爬取前,首先要确定我们想要爬取的数据是否为动态加载数据?
2.先进入到任意一家企业的详情页中,查看企业的详情数据是否为动态加态数据?
# 3.基于抓包工具进行局部搜索
# 搜索的到:不是动态加载
# 搜索不到:是动态加载
# 发生企业的详情数据是动态加载数据
3如何捕获动态加载数据
# 基于抓包工具进行全局搜索,定位到动态加载数据对应的数据包
# url:http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
# 请求方式:POST
# 请求参数: id: a3fc0c56ea71460b9b94fc356a81a35a
# 再次对另一家企业的企业详情数据进行分析
# 定位到了动态加载数据对应的数据包
# 在该数据包中可以提取到url,请求方式和请求参数,对比发现,不同企业的详情数据的数据包请求方式和url是一样的,只有请求参数id的值不一样
#结论:不同企业的企业详情数据对应的数据包只有id的参数不同,剩下都一样
#结果:如果我们可以批量获取多家企业的id值,就可以批量获取更多家企业的企业详情数据。
# 如何指量获取多家企业的id值?
# id通常表示一组数据的唯一标识。联想到企业的名称也会作为企业的唯一标识
# 那么会不会企业的id和企业的名称在页面中是绑定在一起的呢?
# 测试:在首页通过企业名称找到企业的id
# 通过抓包工具的分析,首页中企业的名称等信息也是动态加载数据。
# 捕获动态加载数据。定位到指定的数据包,从数据包的响应数据中发现了不同企业id
# 就可以将不同企业的id取到
解析网页如下(图一)
图二
##点击进入单个网页公司 - > 解析(图三)
撸代码
import requests
# import json
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36X-Requested-With: XMLHttpRequest'
}
main_url ='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
m_data = {
'on': 'true',
'page': '1',
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': ''
}
m_response=requests.post(url=main_url,headers=headers,data=m_data)
json_data = m_response.json()
ids = [] # 存储多家企业的id
for dic in json_data['list']:
_id = dic['ID']
ids.append(_id)
# print(_id)
# 循环对每一家企业的详情数据进行获取
for _id in ids:
# 指定url
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
# 请求参数
data = {
'id': _id
}
# 发起的post请求
response = requests.post(url=url,data=data,headers=headers)
# response.encoding("utf-8")
# 获取响应数据
json_data = response.json() # 如果确定响应数据为json格式字符串才可以调用json方法现实格式化
# 获取企业名称,法人代表,许可证编号 生产许可项目 企业住所
print(json_data['epsName'],json_data['legalPerson'],json_data['productSn'],json_data['certStr'],json_data['epsProductAddress'])