自动抓取 HMDB 外源性代谢物食物来源工具

原文地址:https://itxiaozhang.com/auto-hmdb-exogenous-metabolite-food-source 如果您需要远程电脑维修或者编程开发,请加我微信咨询。 1. 需求分析 代谢物的来源信息对于科研和营养分析非常重要。现有数据库(HMDB)中,外源性代谢物来源信息分散在网页上,手动整理效率低、容易出错。因此,需要一个工具能批量抓取代谢物的外源性来源信息,生成结构化、可分析的 CSV 数据。 2. 工具功能概述 抓取范围:只关注 HMDB 中 Disposition → Exogenous,即代谢物外源性来源。 输出数据:CSV 文件,每条记录包含 HMDB ID、食物名称、FooDB 编号;找不到或出错标 None。 自动化与鲁棒性: 多线程并发抓取,提高效率 随机 User-Agent、防封锁 自动重试和错误处理 每处理若干条自动保存,保证数据安全 用途:支持食物-代谢物关联分析、营养研究及数据库构建。 3. 程序结构 核心程序通过 Python 实现,主要功能包括: 加载 HMDB ID 列表 请求对应网页 提取代谢物外源性食物来源信息 生成 CSV 文件,每条记录包括 HMDB ID、食物名称及对应编号 错误处理和日志记录,确保每个 ID 都有处理结果 示意代码如下: 1 2 3 4 5 6 7 8 9 def get_metabolite_data(hmdb_id): """ 根据 HMDB ID 获取外源性食物来源信息 输出字典包含: - 'HMDB ID' - 'Source(Exogenous)' (食物名称和编号,找不到时为 'None') """ data = {'HMDB ID': hmdb_id, 'Source(Exogenous)': '...'} return data 视频版本 哔哩哔哩 YouTube

2025年12月27日 · 1 分钟 · IT小章

HMDB代谢物信息一键批量获取工具:快速获取代谢组学数据

原文地址:https://itxiaozhang.com/hmdb-metabolite-batch-extraction-tool/ 如果您需要远程电脑维修或者编程开发,请加我微信咨询。 功能特性 支持批量查询HMDB代谢物信息 自动提取关键信息,包括: 代谢物描述 超类(Super Class) 类别(Class) 子类(Sub Class) 来源(Disposition) 内源性(Endogenous) 组织定位(Tissue Locations) 相关ID(KEGG、ChEBI、METLIN) 支持正负离子模式搜索 自动导出CSV格式结果 内置日志记录功能 部分代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 """ ================================ 作者:IT小章 网站:itxiaozhang.com 时间:2024年11月27日 Copyright © 2024 IT小章 ================================ """ import requests import re import csv import time import logging import os from concurrent.futures import ThreadPoolExecutor, as_completed from tqdm import tqdm from lxml import html # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("代谢物提取.log", encoding='utf-8'), logging.StreamHandler() ] ) class MetaboliteExtractor: """代谢物数据提取器""" def __init__(self): self.base_url = "https://hmdb.ca" self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } def process_files(self): """处理输入文件""" try: logging.info("程序开始运行...") results = [] # 处理positive模式 if os.path.exists('positive.txt'): logging.info("处理positive.txt...") results.extend(self._process_file('positive.txt', 'positive')) # 处理negative模式 if os.path.exists('negative.txt'): logging.info("处理negative.txt...") results.extend(self._process_file('negative.txt', 'negative')) if results: self._save_results(results) logging.info(f"处理完成,共获取 {len(results)} 条结果") else: logging.error("未找到任何结果") except Exception as e: logging.error(f"处理过程出错: {str(e)}") finally: logging.info("程序运行结束") print("\n" + "="*50) input("按回车键退出程序...") def _process_file(self, filename, mode): """处理单个文件(具体实现已隐藏)""" try: with open(filename, 'r', encoding='utf-8') as f: data = f.read().strip() if not data: logging.warning(f"{filename} 为空") return [] logging.info(f"正在处理 {filename}") return self._extract_data(data, mode) except FileNotFoundError: logging.error(f"未找到文件: {filename}") return [] def _extract_data(self, data, mode): """提取数据(具体实现已隐藏)""" # 核心实现已隐藏 pass def _save_results(self, results): """保存结果到CSV""" try: filename = '代谢物数据.csv' with open(filename, 'w', newline='', encoding='utf-8-sig') as f: if results: writer = csv.DictWriter(f, fieldnames=results[0].keys()) writer.writeheader() writer.writerows(results) logging.info(f"数据已保存到 {filename}") except Exception as e: logging.error(f"保存数据失败: {str(e)}") def main(): extractor = MetaboliteExtractor() extractor.process_files() if __name__ == "__main__": main() 使用方法 准备输入文件: ...

2025年5月15日 · 2 分钟 · IT小章

利用Python从HMDB数据库批量提取质谱数据中的化合物信息

原文地址:https://itxiaozhang.com/python-hmdb-mass-spectrometry-compound-extraction/ 如果您需要远程电脑维修或者编程开发,请加我微信咨询。 需求分析 本工具旨在帮助用户根据质谱数据(质量数),自动从HMDB数据库批量检索代谢物信息,包括HMDB ID、常用名称、化学式及结构图片等,并导出为Excel可直接打开的CSV文件,极大提升代谢物注释效率。 程序介绍 准备数据:将所有待检索的质量数写入negative.txt文件,每行一个。 运行脚本: 双击或命令行运行hmdb_metabolite_extractor.py脚本。 程序自动读取negative.txt,并按负离子模式批量检索HMDB。 检索结果自动保存为代谢物数据.csv,日志信息保存在代谢物提取.log。 主要功能模块: 质量数批量检索:自动根据质量数和离子模式检索HMDB ID 代谢物详细信息抓取:根据HMDB ID获取常用名称、化学式、结构图片等信息 并发加速与重试机制:采用多线程并发抓取,自动重试机制 结果导出:自动整理为CSV文件,支持Excel直接打开 部分代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 """代谢物数据处理工具""" import json, os, logging from concurrent.futures import ThreadPoolExecutor, as_completed from tqdm import tqdm from typing import List, Dict, Optional class DataManager: def __init__(self, cache_file='cache.json', progress_file='progress.json'): self.cache_file = cache_file self.progress_file = progress_file self.cache = self._load_json(cache_file, {}) self.progress = self._load_json(progress_file, {'processed': []}) def _load_json(self, file: str, default: Dict) -> Dict: if os.path.exists(file): try: with open(file, 'r', encoding='utf-8') as f: return json.load(f) except: pass return default def save_progress(self, item_id: str): if item_id not in self.progress['processed']: self.progress['processed'].append(item_id) self._save_json(self.progress_file, self.progress) def _save_json(self, file: str, data: Dict): try: with open(file, 'w', encoding='utf-8') as f: json.dump(data, f) except Exception as e: logging.error(f"保存文件失败: {e}") def is_processed(self, item_id: str) -> bool: return item_id in self.progress['processed'] def get_cache(self, key: str) -> Optional[Dict]: return self.cache.get(key) def set_cache(self, key: str, data: Dict): self.cache[key] = data self._save_json(self.cache_file, self.cache) def setup_logging(): logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("处理日志.log", encoding='utf-8'), logging.StreamHandler() ] ) def process_data(items: List[str], resume: bool = False) -> List[Dict]: """处理数据的主要函数 Args: items: 待处理的数据项列表 resume: 是否继续上次的进度 Returns: 处理结果列表 """ data_manager = DataManager() results = [] for item in items: # 检查是否已处理 if resume and data_manager.is_processed(item): continue # 获取数据 - data = {"id": item, "status": "processed"} results.append(data) # 保存进度 data_manager.save_progress(item) return results def main(): setup_logging() try: # 读取输入数据 - items = ["item1", "item2", "item3"] # 处理数据 results = process_data(items, resume=True) # 保存结果 - if results: logging.info(f"成功处理 {len(results)} 条数据") except Exception as e: logging.error(f"程序执行出错: {e}") if __name__ == "__main__": main() 视频版本 哔哩哔哩 YouTube

2025年5月8日 · 2 分钟 · IT小章