zoukankan      html  css  js  c++  java
  • (二)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')
  • 相关阅读:
    flink 读取kafka 数据,partition分配
    Flink 报错 "Could not find a suitable table factory for 'org.apache.flink.table.factories.StreamTableSourceFactory' in the classpath"
    flume接收http请求,并将数据写到kafka
    【翻译】Flume 1.8.0 User Guide(用户指南) Processors
    【翻译】Flume 1.8.0 User Guide(用户指南) Channel
    【翻译】Flume 1.8.0 User Guide(用户指南) Sink
    【翻译】Flume 1.8.0 User Guide(用户指南) source
    【翻译】Flume 1.8.0 User Guide(用户指南)
    Apache Flink 简单安装
    Java之使用IDE
  • 原文地址:https://www.cnblogs.com/sxy-blog/p/13213859.html
Copyright © 2011-2022 走看看