【药监总局】python&&抓取企业详情数据

本文档详细介绍了如何使用Python进行网络爬虫,以获取国家药品监督管理局网站上各家企业详情数据。首先确定数据非动态加载,然后通过抓包工具找到动态加载详情数据的POST请求,提取出URL、请求方式和参数。通过企业名称获取企业ID,并批量获取多家企业详情,解析出企业名称、法人代表、许可证编号和企业住所等关键信息。
Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

提前准备工作

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

二.要求:抓取每一家企业的企业详情数据

思路

1.在对一个陌生的网站进行数据爬取前,首先要确定我们想要爬取的数据是否为动态加载数据?

2.先进入到任意一家企业的详情页中,查看企业的详情数据是否为动态加态数据?

  # 3.基于抓包工具进行局部搜索
  # 搜索的到:不是动态加载
  # 搜索不到:是动态加载
    # 发生企业的详情数据是动态加载数据

3如何捕获动态加载数据

  # 基于抓包工具进行全局搜索,定位到动态加载数据对应的数据包
    # url:http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
    # 请求方式:POST
    # 请求参数: id: a3fc0c56ea71460b9b94fc356a81a35a
# 再次对另一家企业的企业详情数据进行分析
  # 定位到了动态加载数据对应的数据包
   # 在该数据包中可以提取到url,请求方式和请求参数,对比发现,不同企业的详情数据的数据包请求方式和url是一样的,只有请求参数id的值不一样

  #结论:不同企业的企业详情数据对应的数据包只有id的参数不同,剩下都一样
  #结果:如果我们可以批量获取多家企业的id值,就可以批量获取更多家企业的企业详情数据。

  # 如何指量获取多家企业的id值?
     # id通常表示一组数据的唯一标识。联想到企业的名称也会作为企业的唯一标识
      # 那么会不会企业的id和企业的名称在页面中是绑定在一起的呢?
      # 测试:在首页通过企业名称找到企业的id
       # 通过抓包工具的分析,首页中企业的名称等信息也是动态加载数据。
       # 捕获动态加载数据。定位到指定的数据包,从数据包的响应数据中发现了不同企业id
       # 就可以将不同企业的id取到

解析网页如下(图一)

在这里插入图片描述

图二

在这里插入图片描述
##点击进入单个网页公司 - > 解析(图三)
在这里插入图片描述

撸代码

import requests
# import json
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 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)
    # print(_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)
    # response.encoding("utf-8")
    # 获取响应数据
    json_data = response.json() # 如果确定响应数据为json格式字符串才可以调用json方法现实格式化
    # 获取企业名称,法人代表,许可证编号 生产许可项目 企业住所
    print(json_data['epsName'],json_data['legalPerson'],json_data['productSn'],json_data['certStr'],json_data['epsProductAddress'])

爬取想要的信息如(图)

在这里插入图片描述

执行结果

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 使用 Python 处理数据 #### Fiddler4 和 Selenium 结合使用获取局网站数据 为了从国家局网站上获取数据,可以采用两种方法:一种是通过抓包工具Fiddler4配合安卓模拟器来捕获请求链接;另一种则是利用Selenium WebDriver直接操作浏览器自动化流程并提取所需的数据[^1]。 对于前者而言,在配置好环境之后启动Fiddler4听HTTP/HTTPS流量,并设置Android设备或其仿真器信任该代理服务器证书以便能够解密SSL通信。接着打开目标网页执行查询动作,则可以在软件界面内观察到所有进出站的消息记录从而定位至实际API接口地址。 而后者主要依赖于`webdriver.Chrome()`实例化对象加载页面元素直至完成交互过程中的动态渲染部分后再读取DOM树结构中包含的信息片段作为最终输出结果: ```python from selenium import webdriver import time options = webdriver.ChromeOptions() driver = webdriver.Chrome(options=options) try: driver.get('https://www.nmpa.gov.cn/') # 假设这里有一些针对特定控件的操作比如输入框填值按钮点击等事件触发 search_box = driver.find_element_by_id("searchValue") # 替换成真实的ID名称 submit_button = driver.find_element_by_class_name("submit-button-class") search_box.send_keys("2023") submit_button.click() time.sleep(5) # 等待页面加载完毕 finally: html_content = driver.page_source with open('./nmpa_data.html', 'w+', encoding='utf-8') as f: f.write(html_content) driver.quit() ``` 上述脚本展示了如何创建Chrome驱动程序并通过它访问指定URL以及模拟用户行为向搜索栏发送关键词后提交表单等待响应返回再保存整个HTML文档供后续解析处理。 #### 利用明文链接直接发起 HTTP 请求 如果已经掌握了确切的服务端点形式如:“https://www.nmpa.gov.cn/datasearch/data/nmpadata/search?...”,那么可以直接借助第三方库例如 `requests` 来简化网络层面上的工作量而不必绕远路去模仿真实用户的浏览习惯。下面给出一段简单的代码示例说明怎样构造参数字典并向远程服务器发出GET方式的询问进而接收JSON格式的回答体: ```python import requests url = "https://www.nmpa.gov.cn/datasearch/data/nmpadata/search" params = { "itemId": "ff80808183cad75001840881f848179f", "isSenior": "N", "searchValue": "2023", "pageNum": 1, "pageSize": 10, "timestamp": int(time.time() * 1000), } response = requests.get(url, params=params).json() print(response['data']) # 输出具体的结果集列表项 ``` 这段逻辑同样适用于其他任何开放式的RESTful风格Web服务只要明确了各个字段含义即可灵活调整以适应不同场景下的需求[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值