python使用抓包工具Fiddler4和selenium获取国家药监局网站数据

获取药监局网站数据

药监局网站反爬比较厉害,本文介绍了用抓包工具Fiddler4和安卓模拟器先获取数据链接,然后用selenium.webdriver模拟手机访问获得最终数据。本文以抓取国产药品详情页为目标,本文仅供学习交流!!在这里插入图片描述
在这里插入图片描述

1.使用Fiddler4和安卓模拟器获取数据链接

药监局有app,所以我们可以通过Fiddler4和安卓模拟器来抓取数据链接,本文以抓取国产药品详情页为目标:
  1. 下载Fiddler4并安装,使用教程https://blog.csdn.net/God_XiangYu/article/details/105512462在这里插入图片描述

  2. 注意Fiddler4要设置通讯端口,我这设置的8888;

  3. 安装逍遥模拟器并安装药监局app,设置安卓模拟器为非root模式;

逍遥模拟器并安装药监局app

  1. 进入安卓模拟器设置里,打开网络连接,设置通讯端口和ip,ip为本机ip;在这里插入图片描述

  2. 在安卓模拟器里打开药监局app,点到国产药品,查看Fiddler4里数据信息;药品详情页

点击result为200的最新一行
在这里插入图片描述
查看数据
在这里插入图片描述
红线里get请求的连接就是药品详情页的后面的链接,完整的链接为http://mobile.nmpa.gov.cn/datasearch/QueryRecord?tableId=25&searchF=ID&searchK=109228。
tableId=25 里25 是国产药品页面的代表数字,searchK=109228 里109228是药品编号。

  1. 将得到的网站链接用谷歌浏览器打开试试,看看能得到什么。注意要用手机模式打开,图中红框点亮就是手机模式;在这里插入图片描述
    我们就直接得到数据了。

2.使用selenium.webdriver获取数据

为什么不直接requests.get,这是因为该网站用到了cookie 反爬,每次访问都会有验证,cookie还会改变,所以就用selenium.webdriver获取数据了。

  1. 具体代码如下:
from selenium import webdriver
import json


mobileEmulation = {'deviceName': 'iPhone 6/7/8'}   #设置手机环境
options = webdriver.ChromeOptions()
options.add_argument('headless')    #设置不显示页面
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option('mobileEmulation', mobileEmulation)
#executable_path 为chromedriver文件路径,chromedriver是谷歌浏览器驱动软件
driver = webdriver.Chrome(executable_path='./chromedriver.exe', options=options)

i=109228
print("爬取第%d个" % i)
url = 'http://mobile.nmpa.gov.cn/datasearch/QueryRecord?tableId=25&searchF=ID&searchK=' + str(i)
driver.get(url)
xpath_drug = "//body"
data = driver.find_elements_by_xpath(xpath_drug)

#清洗获取的数据,tag = True 是数据不为空
info = ""
tag = True
for i2 in data:
    if i2.text == "[]":
        tag = False
    else:
        info += str(i2.text)
if tag == True:
    d = info.split("},{")
    info = "},{".join(d[:-1]) + "}]"
    Data = json.loads(info)
    print(Data)
#关闭
driver.quit()
  1. 程序显示,获取的数据如下
    在这里插入图片描述
    [{‘NAME’: ‘批准文号’, ‘CONTENT’: ‘国药准字Z20020147’}, {‘NAME’: ‘产品名称’, ‘CONTENT’: ‘龟龙中风丸’}, {‘NAME’: ‘英文名称’, ‘CONTENT’: ‘’}, {‘NAME’: ‘商品名’, ‘CONTENT’: ‘’}, {‘NAME’: ‘剂型’, ‘CONTENT’: ‘丸剂(水丸)’}, {‘NAME’: ‘规格’, ‘CONTENT’: ‘每30丸重5g’}, {‘NAME’: ‘上市许可持有人’, ‘CONTENT’: ‘’}, {‘NAME’: ‘生产单位’, ‘CONTENT’: ‘沈阳红药集团股份有限公司’}, {‘NAME’: ‘生产地址’, ‘CONTENT’: ‘沈阳市大东区北大营西路2号’}, {‘NAME’: ‘产品类别’, ‘CONTENT’: ‘中药’}, {‘NAME’: ‘批准日期’, ‘CONTENT’: ‘2015-07-30’}, {‘NAME’: ‘原批准文号’, ‘CONTENT’: ‘’}, {‘NAME’: ‘药品本位码’, ‘CONTENT’: ‘86901343001160’}, {‘NAME’: ‘药品本位码备注’, ‘CONTENT’: ‘’}]

  2. 通过修改链接里searchK的值,就可以把全部的国产药品的详细信息获取下来。

3.结束

### 使用 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]。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值