当前位置: 首页 > news >正文

TCMSP中药数据一键采集工具(带图形界面的Python可执行程序)

本文还有配套的精品资源,点击获取

简介:直接运行就能抓取TCMSP网站上的中药、化合物、靶点等结构化数据,不用装Python环境,Windows双击main.exe就能用。内置可视化操作界面,支持按中药名称检索、自动翻页、请求频率控制、实时进度条显示,还能自动跳过已爬过的条目避免重复请求。所有原始数据(如化合物ID、靶点蛋白名、ADME参数)会以清晰格式保存,方便后续导入Excel或分析软件。程序自带缓存机制,断点续爬不丢进度;源码完整开放,含爬虫核心逻辑(tcmsp_spider.py)、网络请求封装(http_processor.py)、界面交互(main.py)和进度反馈模块(Progress.py),也兼容本地Python 3.6+环境调试修改。配套requirements.txt列明全部依赖,dist.rar里已打包好可执行文件,图标、配置、临时缓存文件(cache.txt)都已就位,开箱即用。

1. 项目概述:为什么你需要一个“不折腾”的TCMSP数据采集工具?

在中药网络药理学研究里,TCMSP(Traditional Chinese Medicine Systems Pharmacology Database)几乎是绕不开的起点。它提供了超过500味中药、近3万个化合物、2000多个靶点蛋白以及ADME(吸收、分布、代谢、排泄)参数等关键结构化数据。但问题来了——它的网站没有官方API,网页结构嵌套深、反爬逻辑虽不激进却有隐性限制(比如无明确User-Agent拦截,但连续高频请求会触发JS验证或IP临时限流),更麻烦的是,手动一页页点开、复制、粘贴、整理Excel,光是“黄芪”这一味药,就得翻20+页化合物列表,每页15条,再逐条点进靶点详情页……我试过一次,花了整整3小时,只搞定了不到1/4的数据,还漏了ADME参数栏。这不是做科研,这是在当人肉OCR。

所以这个工具不是“又一个爬虫”,而是专为中医药研究者设计的数据采集工作台。它把“能不能抓”变成了“想抓哪味药就点哪味”,把“写代码调requests、处理HTML解析、调试XPath、加延时、存缓存、做重试”这些本该由程序员干的活,全封装进一个双击就能运行的main.exe里。你不需要知道什么是BeautifulSoup,也不用查Python版本兼容性;你只需要打开它,输入“丹参”或“葛根”,点“开始采集”,进度条动起来,结果自动存成带表头的CSV——字段名全是中文:“中药名称”“化合物ID”“化合物名称”“靶点蛋白名(UniProt ID)”“靶点蛋白全称”“口服生物利用度(OB%)”“血脑屏障穿透性(BBB)”“类药性(DL)”。我把它放在实验室公用电脑上,连刚进组的硕士生,培训5分钟就能独立跑通“清肺排毒汤”四味药的全量靶点提取。

关键词里的“TCMSP爬虫”“中药数据采集”“Python可视化工具”,说的其实是同一件事:降低中医药数据获取的技术门槛,把时间还给机制分析和实验验证。它不追求技术炫技,不堆砌异步并发或分布式架构,而是死磕三个真实痛点:第一,Windows用户零环境依赖(exe直接跑);第二,界面操作符合科研人员直觉(不是命令行输一堆参数);第三,断电、断网、手抖关窗都不丢进度(cache.txt不是摆设,是真能续爬)。后面你会看到,这个“简单”背后,藏着对TCMSP网站结构长达两周的逆向梳理、对HTTP状态码组合的精细化响应策略,以及一个被反复打磨到只剩3个核心函数的缓存校验逻辑。

2. 整体架构与设计思路:为什么选Tkinter?为什么不用Scrapy或Selenium?

2.1 架构分层:四模块协同,各司其职不越界

整个工具采用清晰的职责分离设计,不是把所有代码塞进main.py里硬编码,而是拆成四个功能明确、低耦合的模块:

  • main.py:界面中枢与流程调度器
    它不碰任何网络请求或数据解析,只做三件事:初始化Tkinter窗口、绑定按钮点击事件、调用其他模块的接口并接收返回值。比如点击“开始采集”后,它只做:① 读取用户输入的中药名;② 调用tcmsp_spider.start_crawl(med_name);③ 把返回的进度对象传给Progress.py更新UI。这种设计让界面逻辑干净得像一张白纸,改图标、调字体、增按钮,完全不影响爬虫核心。

  • tcmsp_spider.py:爬虫引擎,专注“找数据”
    这是真正的数据挖掘机。它不负责发请求(那是http_processor的事),也不管界面怎么显示(那是main和Progress的事),只干两件核心事:① 解析TCMSP搜索页的HTML,提取每味中药对应的URL路径(如/herbs/12345);② 针对单味中药详情页,定位化合物列表区块,循环提取每个化合物卡片里的ID、名称、靶点链接、ADME参数。它的输出是结构化字典列表:[{"herb": "黄芪", "compound_id": "MOL000422", "target": ["P00749", "P08246"], "OB": 74.5, "BBB": 0.12}, ...]。所有XPath表达式都经过实测验证,比如化合物列表的容器div是//div[@class='col-md-12']//table/tbody/tr,而靶点链接藏在td[5]/a/@href里——这些不是靠猜,是我在Chrome开发者工具里对着100个不同中药页面逐个比对确认的。

  • http_processor.py:网络通信管家,管“怎么发请求”
    它把requests库的复杂性彻底屏蔽掉。对外只暴露两个方法:get_html(url)post_search(keyword)。前者封装了超时控制(默认15秒)、重试机制(失败后间隔2秒重试2次)、User-Agent轮换(预置5个主流浏览器UA字符串,每次随机选)、以及最关键的——请求节流。这里不是简单time.sleep(1),而是基于TCMSP服务器响应头里的X-RateLimit-Remaining字段动态调整间隔(虽然TCMSP没明文暴露这个头,但通过大量请求测试发现,连续请求>8次/分钟就会触发503,所以程序内部维护一个滑动窗口计数器,确保每分钟请求≤6次)。它甚至处理了302跳转和gzip解压,让上层模块完全感知不到网络层的存在。

  • Progress.py:进度翻译官,把数字变成“看得见”的反馈
    Tkinter原生的Progressbar组件只能设value(0~100),但用户需要知道“当前在爬第几味药”“已提取多少靶点”。所以Progress.py做了两层映射:第一层,把爬虫返回的原始进度元组(current_step, total_steps, status_msg),转换成0~100的百分比(比如“共需处理12味药,当前第3味”→int(3/12*100)=25);第二层,把status_msg渲染成中文提示语,如“正在解析‘丹参’的化合物列表…(第7/15条)”。它还监听了cache.txt的实时变化,一旦检测到新记录写入,立刻刷新“已缓存条目数”标签——这个细节让使用者心里有底,知道“没白等”。

提示:这种模块划分不是为了炫技,而是为了可维护性。去年有位老师想加“按靶点反查中药”功能,他只改了tcmsp_spider.py里的一个函数,新增了靶点搜索页的解析逻辑,其他三个模块一行代码没动,编译后exe直接可用。

2.2 为什么坚持用Tkinter,而不是PyQt或Web方案?

有人问:“Tkinter界面太简陋,为啥不用PyQt做高颜值界面?”或者“干脆做个网页版,用Flask+Vue,还能跨平台。”我的答案很实在:因为目标用户是中医药研究者,不是前端工程师

  • PyQt确实更美观,但它的安装包体积大(编译后exe超80MB),且Windows下常因VC++运行库缺失报错。而Tkinter是Python标准库,打包后main.exe仅12MB,连Win7 SP1都能跑。
  • 网页方案看似跨平台,但实际增加了使用成本:用户得先启动本地服务(python app.py),再打开浏览器访问http://localhost:5000,还得确保端口没被占用。而双击exe,3秒内窗口就弹出来——这对在医院机房用老旧电脑的临床医生,就是决定性体验差异。
  • 更关键的是,Tkinter的“简陋”恰恰是优势。它的控件少而稳定:Button、Entry、Text、Progressbar、Label,没有复杂的信号槽、样式表、布局管理器概念。我教一位62岁的老教授使用时,他说:“这就像我用Word插表格,一看就懂。”如果换成PyQt的QDockWidget或QTabWidget,光解释“停靠区域”和“选项卡切换”就得花半小时。

至于“为什么不直接用Selenium模拟浏览器?”——TCMSP的页面是纯静态HTML,没有Ajax动态加载,用requests解析快10倍以上。Selenium启动Chrome要3秒,而http_processor.py发一个GET请求平均只要0.8秒。算一笔账:爬100味药,Selenium方案耗时约5分钟,requests方案约30秒。这30秒省下来,够你多看两篇文献摘要。

2.3 缓存机制设计:cache.txt不是日志,是续爬的“存档点”

很多人以为cache.txt只是记录“哪些中药爬过了”,防止重复。其实它的设计远不止于此。它是一个结构化的断点续爬凭证,每行存储一条JSON格式记录:

{"herb_name": "黄芪", "last_compound_id": "MOL000432", "total_targets": 142, "crawl_time": "2024-03-15T14:22:37"}

注意last_compound_id字段——它不是记录“是否完成”,而是记录“爬到哪一化合物了”。这意味着:如果你在爬“黄芪”的第87个化合物时突然断电,重启程序后,它不会从头开始,而是跳过前87条,直接从第88条继续解析靶点。这个设计源于一次真实事故:某次采集“人参”时,网络波动导致第124个化合物的靶点链接加载失败,程序自动跳过并记下ID,后续重跑时精准定位到那一条补采。

cache.txt的写入也不是简单追加。它采用“原子写入+校验”策略:每次写入前,先生成临时文件cache.tmp,写完后用os.replace()原子替换原文件,并立即用json.loads()校验内容合法性。如果校验失败(比如JSON格式错误),程序会回滚到上一个有效备份(cache.bak)。这套机制让我在连续72小时无人值守采集(跑1000+味药)中,缓存损坏率为0。

3. 核心细节解析与实操要点:从中药名到靶点列表的完整链路

3.1 TCMSP网站结构逆向:不是所有“中药”都叫“herb”

TCMSP官网(http://tcmspw.com)的URL路由看似统一,实则暗藏玄机。你以为搜索“黄芪”,地址栏会变成/search?q=黄芪?错。它走的是POST表单提交,且返回的搜索结果页URL形如/herbs?keyword=黄芪。更麻烦的是,“中药”在数据库里分三类:

  • 经典中药(Herbs):如“黄芪”“当归”,对应/herbs/12345路径,化合物数据最全;
  • 中成药(Formulas):如“六味地黄丸”,对应/formulas/67890,但化合物信息常为空;
  • 单体化合物(Compounds):如“丹参酮IIA”,对应/compounds/24680,这类不是我们采集目标。

所以tcmsp_spider.py的第一步,不是急着解析化合物,而是精准识别用户输入属于哪一类。它用正则预判:
- 如果输入含“丸”“散”“膏”“丹”“液”等字(如“逍遥丸”),优先走/formulas搜索;
- 如果输入是单个化学名(含“酮”“苷”“素”“酸”等后缀,如“姜黄素”),走/compounds
- 其余情况,默认按/herbs处理。

这个判断逻辑写在identify_herb_type(keyword)函数里,只有3行代码,却避免了90%的无效请求。我见过太多爬虫脚本,不管三七二十一全往/herbs怼,结果搜“六味地黄丸”返回空列表,还误判为“中药不存在”。

3.2 化合物列表解析:XPath不是万能的,得看DOM树稳定性

TCMSP的化合物列表页(如/herbs/12345)HTML结构如下(简化版):

<div class="container"> <h2>黄芪 (Astragalus membranaceus)</h2> <div class="row"> <div class="col-md-12"> <table class="table table-hover"> <thead><tr><th>ID</th><th>Compound</th><th>Targets</th><th>OB(%)</th></tr></thead> <tbody> <tr><td>MOL000422</td><td>Quercetin</td><td><a href="/targets/P00749">P00749</a></td><td>74.5</td></tr> <tr><td>MOL000432</td><td>Kaempferol</td><td><a href="/targets/P08246">P08246</a></td><td>41.8</td></tr> </tbody> </table> </div> </div> </div>

初学者常犯的错,是直接写XPath//table/tbody/tr。但TCMSP页面有时会插入广告div或统计脚本,导致<table>不在预期位置。更鲁棒的做法是:先定位语义化容器,再找表tcmsp_spider.py里实际用的是:

# 先找到包含"h2"标题且文本含"("的div(确保是中药详情页) herb_container = tree.xpath('//div[contains(@class,"container") and .//h2[contains(text(),"(")]]') if not herb_container: raise ParseError("未找到中药详情容器") # 再在这个容器里找table compound_table = herb_container[0].xpath('.//table[contains(@class,"table-hover")]')

这样即使页面加了新div,只要<h2><table>的父子关系不变,解析就稳如磐石。我测试过TCMSP近3年历史快照,这套XPath在99.2%的页面上都能准确定位。

3.3 靶点数据提取:从链接到蛋白名的两次解析

化合物列表里的“Targets”列,显示的是<a href="/targets/P00749">P00749</a>这样的链接。但研究者真正需要的,是P00749对应的蛋白全称,比如“Coagulation factor VII”。这就需要二次请求:点击链接,进入靶点详情页(/targets/P00749),再解析其中的蛋白名称。

但这里有个坑:TCMSP的靶点页结构不统一。有些靶点(如P00749)有详细描述,蛋白名在<h2>标签里;有些(如Q5VSL9)只有UniProt ID,蛋白名得从<meta name="description">里抠。tcmsp_spider.pyparse_target_page(html)函数用了三级 fallback 策略:

  1. 优先尝试:tree.xpath('//h2/text()')→ 直接取<h2>文本;
  2. 失败则尝试:tree.xpath('//meta[@name="description"]/@content')→ 取meta描述,用正则r'Protein name: ([^,]+)'提取;
  3. 全失败则返回原始ID(如P00749),并记入日志warning.log,方便人工核查。

这个设计保证了数据完整性——宁可返回ID,也不返回空字符串。毕竟在后续网络分析中,P00749""有用得多。

3.4 ADME参数清洗:小数点、百分号、空格的战争

TCMSP页面上的ADME参数,看着是数字,实则充满陷阱。比如OB(口服生物利用度)列,可能显示为:
-"74.5"(正常)
-"74.5%"(带百分号)
-" 74.5 "(前后空格)
-"-"(表示未测定)
-"N/A"(表示不可用)

tcmsp_spider.py里专门有个clean_adme_value(raw_str)函数处理:

def clean_adme_value(s): if not s or s.strip() in ["-", "N/A", ""]: return None # 去空格、去百分号、转浮点 cleaned = s.strip().replace("%", "") try: return float(cleaned) except ValueError: return None # 无法解析的异常值,返回None

这个函数被调用超过10万次(爬完全部中药),成功清洗出98.7%的有效数值,剩下1.3%的None值,在最终CSV里统一标为NULL,方便R或Python的pandas用fillna()处理。比起让使用者自己写正则清洗,这一步省下的时间,够你喝三杯咖啡。

4. 实操过程与核心环节实现:从双击exe到拿到CSV的全流程

4.1 开箱即用:Windows下零配置运行指南

这是最常被问的问题:“exe双击没反应怎么办?”其实90%的情况,都是因为缺少VC++运行库。解决方案极其简单:

  1. 首次运行前,务必先装微软常用运行库
    下载微软官方的vcredist_x64.exe(2015-2022版),双击安装。这是Python打包工具PyInstaller的硬性依赖,不是程序bug。

  2. 双击main.exe,等待3~5秒
    界面不会立刻弹出,因为程序在后台初始化:加载icon.ico、读取cache.txt、检查网络连通性。如果超过10秒没反应,右键任务管理器→结束main.exe进程,重试一次。

  3. 主界面操作三步走
    -Step 1:输入中药名
    在顶部Entry框里输入,支持中文、英文、拼音,如“黄芪”“Astragalus”“huangqi”。支持逗号分隔批量输入:“黄芪,当归,丹参”。
    > 注意:不要输“黄芪注射液”或“黄芪多糖”,这些是制剂,不在TCMSP中药库中。

  • Step 2:配置采集选项

    • ✅ “自动翻页”:勾选后,程序会自动点击“下一页”按钮,直到最后一页。TCMSP单页最多15条,但“甘草”有127条,不勾选就只爬前15条。
    • ✅ “跳过已缓存”:强烈建议勾选。程序会逐行读cache.txt,比对中药名,命中则跳过整味药。
    • ⚙️ “请求延迟(秒)”:默认1.5秒。如果你在单位内网,延迟可调至0.8秒;如果用校园网,建议调至2.5秒防限流。
  • Step 3:点击“开始采集”
    按钮变灰,进度条开始流动,底部状态栏显示实时信息:“正在搜索‘黄芪’…(第1/1味)”。此时不要关闭窗口,也不要切到其他程序——Tkinter的GUI线程和爬虫线程共享主线程,切屏可能导致UI冻结。

  1. 采集完成后的成果物
    - 主目录下生成results_20240315_142237.csv(时间戳命名);
    - CSV用UTF-8编码,Excel可直接打开,表头为中文;
    - 同时生成summary_report_20240315_142237.txt,记录本次采集统计:“共采集1味药,提取化合物87个,靶点蛋白142个,ADME参数完整率92.3%”。

4.2 源码调试:在本地Python环境中修改与扩展

虽然exe开箱即用,但科研需求千变万化。比如你想加“导出靶点GO富集分析模板”,就得改源码。以下是本地调试的标准流程(以Windows + PyCharm为例):

  1. 环境准备
    - 安装Python 3.8(推荐,兼容性最好);
    - 解压资源包,进入根目录,执行:
    bash python -m venv venv venv\Scripts\activate.bat pip install -r requirements.txt

  2. 验证基础运行
    在PyCharm中打开main.py,右键→“Run ‘main’”,应该弹出相同界面。如果报错ModuleNotFoundError: No module named 'tkinter',说明Python安装时没勾选tcl/tk支持,重装Python并勾选即可。

  3. 修改示例:增加“导出为Excel”按钮
    - 在main.pycreate_widgets()函数末尾,添加:
    python self.export_btn = tk.Button(self.root, text="导出为Excel", command=self.export_to_excel) self.export_btn.pack(pady=5)
    - 在类里新增方法:
    python def export_to_excel(self): if not hasattr(self, 'results'): messagebox.showwarning("警告", "请先采集数据!") return import pandas as pd df = pd.DataFrame(self.results) filename = f"results_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx" df.to_excel(filename, index=False) messagebox.showinfo("完成", f"已导出为{filename}")
    - 保存,重新运行main.py,界面上就多了“导出为Excel”按钮。

实操心得:改完代码别急着打包exe,先用python main.py跑通。我踩过的最大坑是——在tcmsp_spider.py里加了print调试语句,忘了删,结果打包后exe的CMD窗口狂闪,用户以为程序崩溃了。记住:所有print必须用logging.info()替代,并在main.py开头配置logging.basicConfig(level=logging.INFO, filename='debug.log')

4.3 打包为exe:PyInstaller的避坑清单

资源包里的dist.rar是现成的exe,但如果你想自定义打包(比如换图标、改版本号),以下是PyInstaller的黄金配置:

  1. 基础命令
    bash pyinstaller --onefile --windowed --icon=icon.ico --name=main main.py
    ---onefile:打成单个exe,不是文件夹;
    ---windowed:隐藏CMD黑窗口(否则爬虫时会弹出控制台);
    ---icon=icon.ico:指定图标,ico尺寸必须是256×256;
    ---name=main:输出文件名为main.exe,不是默认的main.exe。

  2. 关键隐藏参数(救命用)
    ---add-data "icon.ico;.":把图标文件打入exe资源,否则打包后图标丢失;
    ---add-data "cache.txt;.":同理,确保缓存文件随exe一起部署;
    ---hidden-import=tkinter:显式声明tkinter,避免PyInstaller漏掉;
    ---exclude-module matplotlib:排除无关大库,减小exe体积。

  3. 打包后必做三件事
    - ✅ 用Dependency Walker检查exe是否缺失DLL(常见于VC++库);
    - ✅ 在一台全新Win10系统上测试,确认不报“api-ms-win-crt-runtime-l1-1-0.dll missing”;
    - ✅ 右键exe→属性→详细信息,确认“文件版本”“产品名称”已按main.spec里配置填写。

我曾因漏了--add-data参数,导致打包后的exe找不到icon.ico,界面左上角显示默认羽毛图标,被用户吐槽“像盗版软件”。后来把图标路径硬编码进main.py,才解决。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

5.1 真实问题速查表

问题现象可能原因排查步骤解决方案
双击main.exe无反应,任务管理器里也看不到进程VC++运行库缺失1. 下载vcredist_x64.exe安装;2. 运行cmd,输入main.exe看报错安装VC++2015-2022运行库
界面弹出,但点击“开始采集”后进度条不动,状态栏卡在“正在搜索…”网络被拦截或TCMSP域名解析失败1. 浏览器打开http://tcmspw.com,确认能访问;2.ping tcmspw.com看是否通检查防火墙/代理设置,或换DNS(如114.114.114.114)
采集到一半报错:“ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接”TCMSP服务器主动断连(请求太猛)1. 查看debug.log最后几行;2. 检查“请求延迟”是否设为0将请求延迟调至≥1.5秒,勾选“自动翻页”
CSV里靶点列全是“P00749,P08246”,没有蛋白全称靶点详情页解析失败,或网络超时1. 手动访问http://tcmspw.com/targets/P00749,确认能打开;2. 查warning.log是否有“靶点页解析失败”降低请求频率,或手动补全warning.log里的靶点ID
cache.txt里记录了中药,但重启后还是重新爬cache.txt编码不是UTF-8,或路径不对1. 用Notepad++打开cache.txt,确认编码为UTF-8无BOM;2. 确认exe和cache.txt在同一目录用Notepad++另存为UTF-8(无BOM),或把cache.txt拖到exe同目录

5.2 我踩过的五个深坑与独家技巧

坑1:TCMSP的“搜索无结果”页面会返回200状态码,但HTML里是空列表
现象:输入“雪莲”,程序显示“找到0味药”,但没报错,用户以为药名错了。
真相:TCMSP搜索页无论有没有结果,HTTP状态码都是200,区别只在HTML里<div class="no-result">是否存在。
技巧:在tcmsp_spider.py的搜索函数里,加一句:

if tree.xpath('//div[contains(@class,"no-result")]'): raise ValueError(f"TCMSP中未收录中药:{keyword}")

这样直接抛异常,弹窗提示用户,而不是静默失败。

坑2:某些化合物靶点链接是JavaScript跳转,不是真实href
现象:“人参”的某个化合物,<td>里是<a onclick="goToTarget('P12345')">P12345</a>,XPath取不到href。
真相:TCMSP部分老数据用JS跳转,@href为空。
技巧:正则兜底——re.search(r"goToTarget\('([^']+)'", html_text),直接从onclick属性里抠ID。

坑3:ADME参数里的“-”和空格,在CSV里被Excel误识别为日期
现象:OB列显示“1900/1/1”,其实是-符号。
真相:Excel自动把短横线当日期分隔符。
技巧:在main.py保存CSV前,对所有ADME字段加英文引号:

df['OB(%)'] = df['OB(%)'].apply(lambda x: f'"{x}"' if pd.isna(x) else f'"{x}"')

这样Excel强制当文本读。

坑4:长时间采集后,内存泄漏导致exe卡死
现象:跑100味药后,进度条越来越慢,最后假死。
真相:BeautifulSoup的etree对象没释放,gc.collect()也无效。
技巧:不用全局tree,每次解析完立刻del tree,并在循环里加time.sleep(0.1)让GC有时间回收。

坑5:同一味药多次采集,cache.txt里出现重复记录
现象:cache.txt有两条“黄芪”记录,导致下次跳过失效。
真相:程序写入时没做去重,每次采集都追加。
技巧:在write_cache()函数开头,先读取现有cache,用herb_name去重,再写入新记录。三行代码解决:

existing = [json.loads(line) for line in open("cache.txt").readlines() if line.strip()] existing = {item["herb_name"]: item for item in existing} existing[keyword] = new_record with open("cache.txt", "w") as f: for item in existing.values(): f.write(json.dumps(item, ensure_ascii=False) + "\n")

6. 后续可扩展方向:从工具到工作流的进化

这个工具目前聚焦在“数据采集”单一环节,但它可以成为中药网络药理学自动化工作流的起点。根据我和十多位合作老师的实践,下一步最值得投入的三个方向是:

  • 对接Cytoscape自动化
    当前CSV导出后,用户还得手动导入Cytoscape做“中药-化合物-靶点”三元网络。其实tcmsp_spider.py已经能生成标准SIF格式(黄芪 MOL000422 P00749),只需加一个export_to_sif()函数,再调用Cytoscape的REST API(http://localhost:1234/v1/networks),就能一键推送网络。我已在本地测试成功,从采集到Cytoscape成图,全程无需人工点击。

  • ADME参数智能过滤
    现在导出的是全量数据,但研究者常需要“OB≥30%且BBB≥-0.3”的化合物子集。可以在界面加筛选面板:勾选“OB阈值”“BBB范围”,程序在解析时实时过滤,减少CSV体积。这个逻辑只需在tcmsp_spider.pyextract_compound()函数里加两行if判断。

  • 中药别名自动映射
    TCMSP用拉丁学名(如Astragalus membranaceus),但论文里多用中文名。可以内置《中国药典》别名表,用户输“北芪”,自动映射到“Astragalus membranaceus”。这个表我已整理好,含2187味药的12643个别名,存在aliases.json里,只需在搜索前加一层映射。

这些扩展都不需要重写架构,全是模块内的增量开发。工具的价值,不在于它现在有多完美,而在于它为你省下的每一分钟,都能投入到更本质的科学问题里——比如,为什么“黄芪”的靶点集中在PI3K-Akt通路?这个答案,不在爬虫代码里,而在你接下来的湿实验设计中。

我个人在实际使用中发现,最高效的模式是:早上上班第一件事,把当天要分析的5味药填进工具,点“开始采集”,然后去准备细胞实验;中午回来,CSV已就绪,直接导入R跑富集分析。工具不该是科研的障碍,而应是那把趁手的柳叶刀——看不见它的存在,只看见它切开问题时的精准与利落。

本文还有配套的精品资源,点击获取

简介:直接运行就能抓取TCMSP网站上的中药、化合物、靶点等结构化数据,不用装Python环境,Windows双击main.exe就能用。内置可视化操作界面,支持按中药名称检索、自动翻页、请求频率控制、实时进度条显示,还能自动跳过已爬过的条目避免重复请求。所有原始数据(如化合物ID、靶点蛋白名、ADME参数)会以清晰格式保存,方便后续导入Excel或分析软件。程序自带缓存机制,断点续爬不丢进度;源码完整开放,含爬虫核心逻辑(tcmsp_spider.py)、网络请求封装(http_processor.py)、界面交互(main.py)和进度反馈模块(Progress.py),也兼容本地Python 3.6+环境调试修改。配套requirements.txt列明全部依赖,dist.rar里已打包好可执行文件,图标、配置、临时缓存文件(cache.txt)都已就位,开箱即用。


本文还有配套的精品资源,点击获取

http://www.cnnetsun.cn/news/2739091.html

相关文章:

  • 2026年最新录音转文字工具实测:多语言长录音准确性高,好用
  • 2026年亲测AI论文写作软件榜单(高分定稿版)
  • 微信小程序计算机毕设之基于springboot+微信小程序的旅游景点导览APP的设计与实现小程序景区服务(完整前后端代码+说明文档+LW,调试定制等)
  • OpenCV-Python实战:手把手教你用滚动条做一个RGB调色板,理解颜色混合原理
  • 从波形反标失败到成功出功耗报告:手把手解决PTPX读FSDB和Link Library的那些坑
  • Surface Pro4拆机换SSD实战:避开单/双面固态的坑,附无损数据迁移教程
  • 别再只当缓冲器用了!AD8606运放的倍乘电路设计,教你玩转单电源信号放大
  • FPGA驱动0.96寸OLED屏:从SPI时序到状态机设计的避坑指南
  • RPG Maker游戏解密:3分钟解锁加密资源的完整指南
  • 一个AD8606模块的‘翻车’与‘救赎’:从封装焊错到完美复刻信号调理模块
  • HiL仿真调试避坑指南:模型超时、信号失真、接口匹配那些事儿
  • 别再用表格布局了!Dreamweaver CS6的AP Div(层)到底怎么玩?新手避坑指南
  • 别再傻傻用肉眼比对了!用PyTorch+Siamese Network做个图片查重小工具(附完整代码)
  • EduCoder实训答案查询网站是怎么建起来的?从想法到上线的技术栈分享
  • 告别盲调!用Python+OpenCV自制一个HSV/RGB实时调色器(附完整代码)
  • 从‘满月’到‘弦月’:用VAE生成动漫头像,聊聊隐变量空间里到底藏着什么‘秘密’
  • 如何用Fan Control实现Windows风扇智能控制:告别显卡散热噪音的终极指南
  • 3步搞定:将任天堂Joy-Con变身Xbox 360手柄的终极指南
  • 为什么你的Figma插件总在AI生成后崩溃?深度解析AI工具与设计系统间的协议断层,含Adobe XD/Figma/Sketch三端兼容修复指南
  • 如何免费解锁Adobe全家桶:Adobe-GenP 3.0完整破解教程
  • AI生成设计稿被客户拒收的5大法律风险,法务总监联合CTO紧急发布的智能设计交付红线清单(限时公开72小时)
  • 006、Samsung ISOCELL Sensor 技术特点:像素隔离与色彩串扰的工程优化
  • ANSYS Workbench里用AutoDYN做爆炸仿真,和单独打开有啥不一样?新手避坑指南
  • 怎样高效清理重复图片:AntiDupl智能去重工具的全面指南
  • SU(3)格点规范理论的量子模拟与VQE应用
  • 别再让空压机‘抽风’了!手把手教你设置SMC继电器的迟滞模式(附压力值计算)
  • 体验AI结对编程:让快马平台的AI助手帮你解决拖拽排序与状态持久化难题
  • 决策响应时间从小时级压缩至800ms:某世界500强智能调度系统的5步重构实录
  • 小程序毕业设计-基于微信小程序的个性化音乐系统基于springboot+微信小程序的在线音乐个性化推荐APP的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • AD8605和AD8606运放模块踩坑实录:从封装画错到倍乘电路调试,我的硬件调试笔记