requests基础综合实战
需求:爬取药监总局网址前5页的企业名称、许可证编号、法人
分析:
1、我们需要的数据,在企业详情页面,都是可以获取到。
- 先进入到任意一家企业的详情页中,查看企业的详情数据是否为动态加载数据?
- 基于抓包工具进行局部搜索(network中路径有浏览器地址栏中的一致的数据包中进行局部搜索)
- 搜索的到:不是动态加载
- 搜索不到:是动态加载
- 发现企业的详情数据是动态加载数据
- 如何捕获动态加载数据?
- 基于抓包工具进行全局搜索,定位到动态加载数据对应的数据包
- url:http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
- 请求方式:post
- 参数:id: d601af664b5940029601d6d0a05be321
成功获取一家企业的数据:
import requests
#指定url
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
#请求参数
data = {
'id':'d601af664b5940029601d6d0a05be321'
}
#UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36X-Requested-With: XMLHttpRequest'
}
#发起的post请求
response = requests.post(url=url,data=data,headers=headers)
#获取响应数据
json_data = response.json() #如果确定响应数据为json格式字符串才可以调用json方法实现反序列化
#获取企业名称,法人代表,许可证编号
print(json_data['epsName'],json_data['legalPerson'],json_data['productSn'])
2、成功获取一家企业的数据后,再次查看另外一家企业的数据,发现请求地址以及方式都一致,只有id不一致;
3、只要能成功批量获取多家企业的id,即可批量获取多家企业的企业详情数据。
4、测试发现,在首页中能获取企业的id参数。通过抓包工具分析,首页也是动态加载数据。
- url:http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
- 请求方式:post
- 参数:{
"on": "true",
"page": "1",
"pageSize": "15",
"productName": "",
"conditionType": "1",
"applyname": "",
"applysn": "",
}
5、发起请求,批量获取id
import requests
#UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 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()
for dic in json_data['list']:
_id = dic['ID']
print(_id)
6、整合代码
import requests
#UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 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)
#循环对每一家企业的详情数据进行获取
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)
#获取响应数据
json_data = response.json() #如果确定响应数据为json格式字符串才可以调用json方法实现反序列化
#获取企业名称,法人代表,许可证编号
print(json_data['epsName'],json_data['legalPerson'],json_data['productSn'])
7、到目前为止,我们已经成功获取第一页所有企业的相关数据,如果获取前5页呢?
- 只需要获取前5页企业的id,我们就能通过id获取企业相关数据;
- 通过页面分析,前5页数据,只是请求参数中page的值不一样,其他都一样。
8、循环获取多页数据的id,从而获取相关数据
import requests,json
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
param = '''{
"on": "true",
"page": "%d",
"pageSize": "15",
"productName": "",
"conditionType": "1",
"applyname": "",
"applysn":""
}'''
ids = []
for i in range(1,6):
#循环获取多页数据企业的id
new_param = format(param%i)
response_json = requests.post(url = url,headers = headers, params = json.loads(new_param)).json()
# print(response_json)
for dic in response_json["list"]:
id = dic["ID"]
ids.append(id)
# print(id)
#2、根据ID获取企业详情
for id in ids:
d_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
d_param = {
"id": id
}
d_res_json = requests.post(url = d_url,headers = headers,params = d_param).json()
# print(d_res_json)
name = d_res_json["epsName"]
productSn = d_res_json["productSn"]
legalPerson = d_res_json["legalPerson"]
address = d_res_json["epsAddress"]
print(name,productSn,legalPerson,address)

浙公网安备 33010602011771号