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

  • 获取药监局网站数据
  • 1.使用Fiddler4和安卓模拟器获取数据链接
  • 2.使用selenium.webdriver获取数据
  • 3.结束


获取药监局网站数据

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

python 读取fiddler抓包的结果 python获取fiddler抓包结果_python


python 读取fiddler抓包的结果 python获取fiddler抓包结果_数据_02

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

药监局有app,所以我们可以通过Fiddler4和安卓模拟器来抓取数据链接,本文以抓取国产药品详情页为目标:
  1. 下载Fiddler4并安装,使用教程
  2. python 读取fiddler抓包的结果 python获取fiddler抓包结果_安卓模拟器_03

  3. 注意Fiddler4要设置通讯端口,我这设置的8888;
  4. 安装逍遥模拟器并安装药监局app,设置安卓模拟器为非root模式;

python 读取fiddler抓包的结果 python获取fiddler抓包结果_android_04

  1. 进入安卓模拟器设置里,打开网络连接,设置通讯端口和ip,ip为本机ip;
  2. python 读取fiddler抓包的结果 python获取fiddler抓包结果_selenium_05

  3. 在安卓模拟器里打开药监局app,点到国产药品,查看Fiddler4里数据信息;
  4. python 读取fiddler抓包的结果 python获取fiddler抓包结果_安卓模拟器_06

点击result为200的最新一行

python 读取fiddler抓包的结果 python获取fiddler抓包结果_python_07


查看数据

python 读取fiddler抓包的结果 python获取fiddler抓包结果_android_08


红线里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’: ‘’}]
  1. 程序显示,获取的数据如下
  2. python 读取fiddler抓包的结果 python获取fiddler抓包结果_python_09


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

3.结束