动态加载页面信息的爬取

药监总局信息

药监总局url:

http://scxk.nmpa.gov.cn:81/xk/

想要爬取到页面上每一个公司的具体信息,先信息搜集在这里插入图片描述
可以看到,get请求到的数据包中是没有这些具体信息的,那些信息很可能是动态加载出来的,并不能直接从url中请求到,可能是由Ajax对应的请求请求到。

那么就查找Ajax的包
在这里插入图片描述
果然发现了json数据,格式化校验后发现公司的信息
在这里插入图片描述
又发现每家公司都会有一个id,这个id对应的就是自己公司的信息,那么id就可以从对应Ajax请求到的json串中获取,然后将域名和id拼接起来

import requests
import json

if __name__ == '__main__':
    # 1.批量获取不同企业id值
    url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    data = {
        'on': 'true',
        'page': '1',
        'pageSize': '15',
        'productName': '',
        'conditionType': '1',
        'applyname': '',
        'applysn': ''
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
    }
    json_ids = requests.post(url=url, headers=headers, data=data).json()  # 将发请求与获取数据合在一起
    id_list = []  # 企业id
    all_data_list = []
    for dic in json_ids['list']:
        id_list.append(dic['ID'])

    post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id in id_list:
        datas = {
            'id': id
        }
        details_json = requests.post(url=post_url, headers=headers, data=datas).json()
        all_data_list.append(details_json)
        # print(details_json)
    # 持久化存储
    fp = open('./alldata.json', 'w', encoding='utf-8')
    json.dump(all_data_list, fp=fp, ensure_ascii=False)

在获取到json数据后,利用遍历的方法通过列表将list存储起来,然后也是用遍历的方法将该列表转换为字典,并一一加载。

以上的操作,只能爬取一页的数据,如果想要爬取所有的,还需要进行分页操作

import requests
import json

if __name__ == '__main__':
    # 1.批量获取不同企业id值
    url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
    }
    id_list = []  # 企业id
    all_data_list = []
    for page in range(1,6):
        page = str(page)
        data = {
            'on': 'true',
            'page': page,
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': ''
        }
        json_ids = requests.post(url=url, headers=headers, data=data).json()  # 将发请求与获取数据合在一起
        for dic in json_ids['list']:
            id_list.append(dic['ID'])

    post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id in id_list:
        datas = {
            'id': id
        }
        details_json = requests.post(url=post_url, headers=headers, data=datas).json()
        all_data_list.append(details_json)
        # print(details_json)
    # 持久化存储
    fp = open('./alldatas.json', 'w', encoding='utf-8')
    json.dump(all_data_list, fp=fp, ensure_ascii=False)

用一个for循环来实现批量获取的页数内容,由于列表只需要定义一个,所以要将id_listall_data_list放在for循环外面,获取数据是每页获取一次,必须放在for循环内。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lum1n0us

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值