requests基础综合实战

需求:爬取药监总局网址前5页的企业名称、许可证编号、法人

分析:
1、我们需要的数据,在企业详情页面,都是可以获取到。

  • 先进入到任意一家企业的详情页中,查看企业的详情数据是否为动态加载数据?
  • 基于抓包工具进行局部搜索(network中路径有浏览器地址栏中的一致的数据包中进行局部搜索)
  • 搜索的到:不是动态加载
  • 搜索不到:是动态加载
    • 发现企业的详情数据是动态加载数据
  • 如何捕获动态加载数据?
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参数。通过抓包工具分析,首页也是动态加载数据。

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)
posted @ 2022-03-19 22:25  Tony_xiao  阅读(49)  评论(0)    收藏  举报