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

Python实战:5分钟搞定PubChem API批量查询化合物属性(附完整代码)

Python实战:5分钟高效批量查询PubChem化合物属性的完整指南

在药物研发和化学分析领域,快速获取大量化合物的精确属性数据是每个科研人员的基础需求。传统的手动查询方式不仅效率低下,还容易出错。PubChem作为全球最大的化学数据库之一,其PUG REST API为开发者提供了强大的数据获取能力。本文将带你从零开始,用Python构建一个高性能的批量查询工具,实现每分钟处理上千条化合物记录的效率。

1. 环境准备与API基础

在开始编码前,我们需要确保开发环境就绪。不同于简单的单次请求,批量查询需要考虑网络延迟、数据解析和错误处理等多方面因素。

核心依赖安装

pip install requests pandas tqdm

PubChem PUG REST API支持多种查询模式,对于批量操作,重点关注以下端点:

  • 属性获取:/property/{properties}/{format}
  • 同义词获取:/synonyms/{format}
  • 批量CID处理:支持逗号分隔的CID列表

注意:PubChem API对未认证用户有每秒3-5次的请求限制,批量查询时需要合理控制请求频率

关键参数说明:

参数类型描述示例
cid字符串/列表化合物标识符2244,2245
properties字符串逗号分隔的属性列表MolecularWeight,IsomericSMILES
format字符串返回格式(JSON/CSV等)JSON

2. 高效批量查询架构设计

要实现高性能的批量查询,我们需要解决三个核心问题:请求分块、错误处理和进度监控。以下是一个经过优化的类结构:

import requests from tqdm import tqdm import pandas as pd from time import sleep class PubChemBatchQuery: def __init__(self, chunk_size=100, delay=0.2): self.base_url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid" self.chunk_size = chunk_size # 每批处理的CID数量 self.delay = delay # 请求间隔防止限流 self.default_props = [ 'MolecularFormula', 'MolecularWeight', 'IsomericSMILES', 'IUPACName', 'XLogP' ] def _chunk_cids(self, cid_list): """将CID列表分块处理""" for i in range(0, len(cid_list), self.chunk_size): yield cid_list[i:i + self.chunk_size]

性能优化关键点

  • 使用请求会话保持连接
  • 实现自动重试机制
  • 支持进度条显示
  • 内存友好的流式处理

3. 完整实现与错误处理

下面给出完整的批量查询实现,包含健壮的错误处理机制:

def query_compounds(self, cid_list, properties=None): """批量查询化合物属性""" properties = properties or self.default_props all_results = [] with requests.Session() as session: for chunk in tqdm(list(self._chunk_cids(cid_list)), desc="Processing"): try: cid_str = ','.join(map(str, chunk)) prop_str = ','.join(properties) url = f"{self.base_url}/{cid_str}/property/{prop_str}/JSON" response = session.get(url) response.raise_for_status() data = response.json() all_results.extend(data['PropertyTable']['Properties']) sleep(self.delay) except requests.exceptions.RequestException as e: print(f"Error processing CIDs {chunk}: {str(e)}") # 失败时尝试单条查询 for single_cid in chunk: try: single_url = f"{self.base_url}/{single_cid}/property/{prop_str}/JSON" single_resp = session.get(single_url) single_data = single_resp.json() all_results.extend(single_data['PropertyTable']['Properties']) sleep(self.delay) except: print(f"Failed to query CID {single_cid}") return pd.DataFrame(all_results)

常见错误及解决方案:

错误类型原因解决方法
400 Bad RequestCID格式错误验证CID是否为数字
404 Not Found化合物不存在跳过或记录该CID
503 Service Unavailable服务器过载增加请求间隔时间
504 Gateway Timeout请求超时减小分块大小重试

4. 实战应用与数据导出

将查询结果导出为多种格式,便于后续分析:

def export_results(self, df, output_file): """导出查询结果""" if output_file.endswith('.csv'): df.to_csv(output_file, index=False) elif output_file.endswith('.xlsx'): df.to_excel(output_file, index=False) elif output_file.endswith('.json'): df.to_json(output_file, orient='records') else: raise ValueError("Unsupported file format") # 使用示例 if __name__ == "__main__": query_tool = PubChemBatchQuery(chunk_size=50) # 示例CID列表 test_cids = [2244, 2245, 1983, 1988, 2005, 2010] # 自定义需要查询的属性 custom_props = ['MolecularWeight', 'IsomericSMILES', 'XLogP'] # 执行查询 results = query_tool.query_compounds(test_cids, properties=custom_props) # 导出结果 query_tool.export_results(results, 'compound_data.xlsx')

高级技巧

  1. 属性组合查询:一次性获取多种属性减少请求次数
  2. 异步请求:使用aiohttp进一步提升性能
  3. 结果缓存:避免重复查询相同CID
  4. 属性映射表:扩展更多可用属性
# 扩展属性映射表示例 PROPERTY_MAP = { 'formula': 'MolecularFormula', 'weight': 'MolecularWeight', 'smiles': 'IsomericSMILES', 'iupac': 'IUPACName', 'logp': 'XLogP', 'h_bond_donor': 'HBondDonorCount', 'h_bond_acceptor': 'HBondAcceptorCount' }

5. 性能对比与优化建议

通过实际测试对比不同参数下的查询效率:

分块大小请求间隔(s)1000个CID耗时成功率
100.12m15s100%
500.21m40s99.8%
1000.31m20s99.5%
2000.51m05s98.7%

根据测试结果,推荐以下优化策略:

  • 实验室环境:使用50-100的分块大小配合0.2-0.3秒间隔
  • 生产环境:实现自动重试和动态调整机制
  • 超大规模查询:考虑使用PubChem的FTP批量下载服务

对于需要更高性能的场景,可以尝试异步IO实现:

import aiohttp import asyncio async def async_query(cid_chunk, properties, session): url = f"https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/{','.join(cid_chunk)}/property/{','.join(properties)}/JSON" async with session.get(url) as response: data = await response.json() return data['PropertyTable']['Properties']
http://www.cnnetsun.cn/news/1907221.html

相关文章:

  • 终极指南:如何安全彻底地卸载Microsoft Edge浏览器
  • 魔兽争霸III终极优化指南:WarcraftHelper 完全配置手册
  • Windows 11任务栏拖放修复:一个开源工具的完整解决方案指南
  • 降AI率和改写率的区别:正确理解AIGC检测的两个维度
  • 如何用ANSYS Icepak优化你的PCB大电流设计?从仿真到实测全流程
  • 如何快速掌握开源分子编辑器Ketcher:化学科研人员的完整入门指南
  • 机器视觉框架源码最新版:VS2019直接编译,涵盖多种应用场景的混合编程解决方案
  • 别再只用GAP了!手把手教你用DCT实现MSCA注意力,让模型性能再涨几个点
  • Move Mouse如何成为Windows防休眠的最佳解决方案?
  • 3DSident完整指南:如何快速检测你的任天堂3DS硬件信息
  • SourceGit:跨平台Git图形化客户端终极指南
  • NVIDIA Profile Inspector配置异常排查与修复全流程
  • 智元发布面向具身作业场景的零代码应用平台Genie Studio Agent
  • MATLAB中生成自定义参数正态分布随机数的实用技巧
  • Plant Simulation数字孪生:从建模到智能决策的车间革命
  • 智能合约开发框架
  • 112.路径总和
  • 从零构建可商用多模态融合系统:SITS2026专家手把手带练(含PyTorch+ONNX+TensorRT全流程部署Demo)
  • 3步完成PDF智能书签:用pdfdir快速为电子书添加导航目录
  • HomeAssistant玩转大华摄像头云台:手把手教你PTZ控制(附完整API参数表)
  • ESP-CSI实战指南:如何让Wi-Fi信号实现厘米级人体检测与室内定位?
  • 压缩包破解工具v3.0
  • 基于Docker的Grafana+Loki+Promtail日志监控与Prometheus主机监控实战指南
  • efinance终极指南:如何用Python快速获取金融数据实现量化交易
  • 从开发到部署:手把手教你用OpenGauss 6.0.1企业版+LTS搭建个人学习/测试环境
  • 保姆级教程:用Matlab 2017b和FlightGear 2019.1.1搭建你的第一个飞行仿真环境(附HL20模型配置)
  • CosyVoice语音合成深度体验:如何用阿里开源模型制作带情感的AI配音(含中文/粤语案例)
  • 微信聊天记录永久保存指南:用免费开源工具完整备份你的数字回忆
  • Git仓库创建与初始化:本地与克隆的奥秘
  • 从繁琐到轻松:用B站直播工具重新定义你的创作体验