(二)requests-爬取国家药监局生产许可证数据

首先访问这个页面 url = 'http://125.35.6.84:81/xk/'

我们的目标是抓取这里的每一个企业的详情页数据,但是可以发现这里只有企业的简介信息,所以这就意味着我们要发送两次get请求。

在写代码之前,我们可以大概看一下我们想要的数据大概在什么位置。

1. 我们打开一个公司的详情页

 2. 右击检查,通过Response查找对应的目标数据

从这里我们可以看出,当前的数据是通过ajax请求动态加载出来的

 3.查看头信息,以及参数信息

我们可以看出,当前的请求是post请求,所需要的参数是id,但是从以上的数据来看我们并没有发现哪里有id这个参数。因为我们将目光聚焦到首页。

4. 分析首页所返回的数据

 同样是右击检查,打开抓包工具

 从这里我们可以看出首页的数据也是通过ajax动态加载出来的,并且通过观察我们可以发现在ID的踪迹,至此我们就可以形成一条完整的思路。

5.我们可以看看首页的请求方式,与是否携带了参数

6. 思路:拿到首页的响应数据的ID,并以此为参数向详情页发送post请求,拿到每个详情页的详情数据。

7.代码实现:

import requests
import json

if __name__ == '__main__':
    # 获取各个企业id
    id_list = []
    # 这里的url并非是首页的url 首页中的所有企业信息都是通过ajax动态请求的 因此应查看对应包中的url
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
    }
    # 获取前五页的数据
    for page in range(1, 5):
        page = str(page)
        # 首页请求所需参数
        data = {
            'on': 'true',
            'page': page,
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': ''
        }

        # 向首页发送请求
        response = requests.post(url=url, data=data, headers=header)
        # 拿到json格式的数据
        info = response.json()
        # 拿到所有企业信息的列表
        target_id = info['list']
        for i in target_id:
            # 获取所有企业的id
            id_list.append(i['ID'])

        # 获取企业详情信息
    ret_list = []
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'

    # 获取所有企业的详情数据
    for i in id_list:
        data = {
            'id': i
        }
        ret = requests.post(url=url, data=data, headers=header)
        ret_list.append(ret.json())

    # 持久化存储
    fileName = 'files/药监总局.json'
    with open(fileName, 'w', encoding='utf-8') as f:
        f.write(json.dumps(ret_list, ensure_ascii=False))
    print('work is done')
原文地址:https://www.cnblogs.com/sxy-blog/p/13213859.html