news 2026/4/17 19:04:23

告别手动下载!用Python的PubChemPy库批量抓取化合物3D结构(附完整代码与避坑清单)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别手动下载!用Python的PubChemPy库批量抓取化合物3D结构(附完整代码与避坑清单)

用Python实现化合物3D结构批量下载的工程化实践

在药物研发和材料科学领域,研究人员经常需要处理大量化合物的3D结构数据。传统的手动下载方式不仅效率低下,还容易出错。本文将介绍如何利用Python的PubChemPy库构建一个健壮的批量下载系统,显著提升工作效率。

1. 环境准备与基础配置

1.1 安装PubChemPy库

推荐使用conda进行安装,可以自动处理依赖关系:

conda install -c conda-forge pubchempy

验证安装是否成功:

import pubchempy as pcp print(pcp.__version__)

1.2 理解PubChem数据库

PubChem是全球最大的化学信息数据库之一,包含超过1亿种化合物的详细信息。其中3D构象数据对于分子对接、构效关系研究等计算化学应用至关重要。

注意:并非所有化合物在PubChem中都有3D构象数据,特别是新发现的化合物或某些特殊结构的分子。

2. 核心下载功能实现

2.1 单化合物下载基础代码

最基本的3D结构下载代码如下:

import pubchempy as pcp def download_single_compound(cid, save_path): try: pcp.download('SDF', save_path, overwrite=True, identifier=cid, record_type='3d') print(f"成功下载CID {cid}的3D结构") return True except pcp.NotFoundError: print(f"CID {cid}没有可用的3D构象") return False except Exception as e: print(f"下载CID {cid}时发生错误: {str(e)}") return False

2.2 批量下载的工程化实现

实际工作中,我们通常需要处理成百上千个化合物。以下是优化后的批量下载方案:

import os import time from tqdm import tqdm # 进度条库 def batch_download(cid_list, output_dir, delay=0.5): """ 批量下载化合物3D结构 参数: cid_list: 化合物CID列表 output_dir: 保存目录 delay: 请求间隔(秒),避免服务器限制 """ if not os.path.exists(output_dir): os.makedirs(output_dir) success_count = 0 for cid in tqdm(cid_list): save_path = os.path.join(output_dir, f"{cid}.sdf") if download_single_compound(cid, save_path): success_count += 1 time.sleep(delay) # 礼貌性延迟 print(f"\n下载完成!成功下载{success_count}/{len(cid_list)}个化合物")

3. 高级功能与性能优化

3.1 多线程加速下载

对于大量化合物的下载,可以使用多线程提高效率:

from concurrent.futures import ThreadPoolExecutor def threaded_download(cid_list, output_dir, max_workers=4): with ThreadPoolExecutor(max_workers=max_workers) as executor: results = list(executor.map( lambda cid: download_single_compound( cid, os.path.join(output_dir, f"{cid}.sdf") ), cid_list )) print(f"成功下载{sum(results)}/{len(cid_list)}个化合物")

3.2 结果验证与质量控制

下载完成后,建议进行基本验证:

def validate_sdf_files(output_dir): """ 验证下载的SDF文件是否有效 """ invalid_files = [] for filename in os.listdir(output_dir): if filename.endswith('.sdf'): filepath = os.path.join(output_dir, filename) if os.path.getsize(filepath) < 1024: # 简单大小检查 invalid_files.append(filename) if invalid_files: print(f"发现{len(invalid_files)}个可能无效的文件") return False return True

4. 实战案例与问题排查

4.1 典型应用场景

案例:抗病毒药物筛选数据集准备

假设我们需要下载50种已知抗病毒化合物的3D结构用于虚拟筛选:

# 示例CID列表 antiviral_cids = [ 121304016, 445639, 445643, 445638, 445640, 445642, 445641, 445644, # ...更多CID ] batch_download(antiviral_cids, "./antiviral_compounds")

4.2 常见问题与解决方案

问题类型现象解决方案
网络超时下载过程中断增加重试机制,设置合理延迟
CID无效报NotFoundError提前验证CID有效性
服务器限制HTTP 429错误降低请求频率,使用代理轮换
磁盘空间不足写入失败检查目标目录可用空间
权限问题无法创建文件确保有写入权限

4.3 完整工程化脚本示例

以下是一个整合了所有优化措施的完整脚本:

import os import time import pubchempy as pcp from tqdm import tqdm from concurrent.futures import ThreadPoolExecutor, as_completed class PubChem3DDownloader: def __init__(self, output_dir="output"): self.output_dir = output_dir os.makedirs(self.output_dir, exist_ok=True) def download_single(self, cid, max_retries=3): save_path = os.path.join(self.output_dir, f"{cid}.sdf") for attempt in range(max_retries): try: pcp.download('SDF', save_path, overwrite=True, identifier=cid, record_type='3d') return True except pcp.NotFoundError: return False except Exception as e: if attempt == max_retries - 1: print(f"CID {cid}下载失败: {str(e)}") return False time.sleep(2 ** attempt) # 指数退避 def batch_download(self, cid_list, max_workers=4): with ThreadPoolExecutor(max_workers=max_workers) as executor: futures = { executor.submit(self.download_single, cid): cid for cid in cid_list } success = 0 for future in tqdm(as_completed(futures), total=len(cid_list)): if future.result(): success += 1 time.sleep(0.3) # 控制总体请求速率 print(f"下载完成!成功率: {success}/{len(cid_list)}") return success

在实际项目中,这个脚本帮助我们团队将化合物数据准备时间从原来的数小时缩短到几分钟,同时显著减少了人为错误。特别是在需要定期更新数据集的研究中,自动化脚本的价值更加凸显。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 19:03:38

Squid代理服务器进阶配置:从基础部署到企业级安全与性能调优

1. Squid代理服务器企业级部署基础 第一次接触Squid还是在十年前的公司网络改造项目&#xff0c;当时我们需要为200多人的研发团队搭建统一的网络出口。现在回想起来&#xff0c;那些踩过的坑反而成了最宝贵的经验。不同于基础教程&#xff0c;这里我想分享的是真正在企业环境中…

作者头像 李华
网站建设 2026/4/17 9:15:39

数据恢复神器TestDisk PhotoRec:5步快速找回丢失文件与分区

数据恢复神器TestDisk & PhotoRec&#xff1a;5步快速找回丢失文件与分区 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 你是否曾经不小心删除了重要文件&#xff1f;或者遭遇分区丢失、磁盘损坏的噩梦…

作者头像 李华