Python爬虫实战综合(requests)
1. 需求:
-
爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
-
http://scxk.nmpa.gov.cn:81/xk/
-
# 首先验证出那些企业信息是动态加载出来的 # 不是通过这个url http://scxk.nmpa.gov.cn:81/xk/可以请求到的 # 动态加载数据 ajax 抓包工具验证
-
通过对详情页url~的观察发现:
- url~的域名都是一样的,只有携带的参数(id)不一样
- id值可以从首页对应的ajax请求到的json串中获取
- 域名和id值拼接成一个完整的企业对应的详情页的url
-
通过抓包工具可以知道,详情页的企业详情数据也是动态加载出来的,不能通过以上我们拼接出来的url直接用程序爬取到。(不能通过这组url直接发请求)
-
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=c6fe0e0c374448128149352fc8aca2a3
-
http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById(用这组url)ajax请求
-
观察后发现:
- 所有的post请求的url都是一样的,只有参数id值是不同。
- 批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据的ajax请求的url
2. 代码
# UA伪装修改
import requests
import json
# url = 'http://scxk.nmpa.gov.cn:81/xk/'
headers = {
'User-Agent':'Mozill。。。'
}
# response = requests.get(url = url, headers = headers)
# print(response.text)
# 验证出那些企业信息是动态加载出来的
# 不是通过这个url http://scxk.nmpa.gov.cn:81/xk/可以请求到的
# 动态加载数据 ajax 抓包工具验证
# 批量获取不同企业的id值
url1 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
id_lists = [] # 存储企业的id
data_lists = [] # 存储企业详情的字典列表
# page 可调控
for page in range(1,6):
page = str(page)
# 参数的封装
param = {
'on': 'true',
'page': page,
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': '',
}
response_ids = requests.post(url=url1, headers=headers, data=param).json() # 得到字典对象
# print(response_ids['list'])
for dic in response_ids['list']:
id_lists.append(dic['ID']) # 将每个企业id存储起来
# 获取企业详情数据
url2 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_lists:
# 每次取出一组id封装到参数中
param_id = {
'id': id
}
detail_json = requests.post(url=url2, headers=headers, data=param_id).json() # 结果
# print(detail_json)
data_lists.append(detail_json)
fp = open('./detail.json', 'w', encoding='utf-8')
json.dump(data_lists, fp=fp, ensure_ascii=False)
print('结束')
# 新添加分页操作