写点什么

生物医药蛋白分子数据采集:支撑大模型训练的技术实践分享

作者:颜淡慕潇
  • 2025-03-20
    上海
  • 本文字数:4238 字

    阅读完需:约 14 分钟

生物医药蛋白分子数据采集:支撑大模型训练的技术实践分享


作为生物信息学领域的数据工程师,近期在为蛋白质相互作用预测 AI 大模型构建训练集时,我面临着从 PDB、UniProt 等学术数据库获取高质量三维结构、序列及功能注释数据的核心挑战。通过综合运用反爬对抗技术,成功突破了数据库的速率限制、验证码验证等反爬机制,将数据采集效率提升 4 倍,为蛋白质-配体结合预测模型训练提供了包含 10 万+条有效数据的基础数据集,提高了该模型预测的准确性。

本文结合生物医药数据特点,分享如何构建支撑 AI 模型训练的高质量生物分子数据集,从基础采集到反爬优化的完整技术实现路径。


一、学术数据库反爬机制分析

1.1 典型反爬策略

●  速率限制:PDB 对同一 IP 设置 500req/h 的请求限制

●  CAPTCHA 验证:UniProt 对高频请求触发 Google Recaptcha

● 请求指纹识别:STRING 要求必须使用浏览器 User-Agent

● 动态渲染内容:RCSB PDB 的结构数据需执行 JavaScript 加载

1.2 生物医药数据特性

●  数据格式复杂:包含 XML/MMCIF/TSV 等多种格式

●  结构验证严格:蛋白质三维结构数据需通过验证工具检查

●  合规要求高:需遵守《赫尔辛基宣言》等学术伦理规范

 

二、基础数据采集实现

2.1 环境配置


# Python环境conda create -n bio-crawler python=3.10conda activate bio-crawlerpip install biopython requests beautifulsoup4 selenium # Java环境mvn dependency:add -DgroupId=org.jsoup -DartifactId=jsoup -Dversion=1.17.2
复制代码


2.2 基础采集代码


# PDB结构数据采集def fetch_pdb_structure(pdb_id):    url = f"https://www.rcsb.org/structure/{pdb_id}"    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}    response = requests.get(url, headers=headers)        if response.status_code == 200:        soup = BeautifulSoup(response.text, "html.parser")        structure_data = soup.find("pre", id="mmcif")        if structure_data:            with open(f"{pdb_id}.cif", "w") as f:                f.write(structure_data.text)            return True    return False
复制代码


2.3 原始采集结果


pdb_ids = ["1A2B", "3C4D", "5E6F"]for pdb_id in pdb_ids:    print(f"Fetching {pdb_id}: {fetch_pdb_structure(pdb_id)}") # 输出结果:Fetching 1A2B: TrueFetching 3C4D: False (429 Too Many Requests)Fetching 5E6F: False (403 Forbidden)
复制代码


2.4 遇到的问题总结


三、反爬对抗技术实现

 

3.1 动态住宅代理配置


针对数据采集过程中常见的访问限制问题,动态住宅 IP 代理可提供有效解决方案。其关键优势在于构建了高密度 IP 轮换机制,通过自动化策略实现请求端的持续身份伪装。

之前使用过亮数据的代理服务,稳定、安全且高效,于是决定使用它的动态住宅 IP 代理来解决上述数据采集问题,大概流程如下:


3.1.1 注册与通道创建

1. 账号注册

访问 [Bright Data 官网](bright data ),用这个链接注册可以直接 5 折,不需要额外操作。点击注册及登录链接,即可直接享受折扣,非常推荐使用!

使用邮箱完成注册。登录成功之后,可看到以下界面


2.  创建代理通道


●  进入控制台 → 代理网络 → 动态住宅代理

●  点击「创建通道」,配置以下参数:

●  通道类型:选择「动态住宅代理」

●  并发数:根据采集需求设置(建议初始设为 5-10)

●  地域锁定:选择目标数据库服务器所在地(如美国/欧洲节点)

●  IP 池大小:默认「自动」或指定最小 IP 数量

通道创建成功会提示如下


安装证书


测试一下


有多种代码示例,可根据不同的项目语言进行选择使用,

 

3.1.2 获取代理认证信息

在通道详情页获取以下参数:


PROXY_HOST = "brd.superproxy.io"  # 通用代理主机PROXY_PORT = 22225                # 动态住宅代理端口PROXY_USER = "brd-customer-hl_5aaa3f49-zone_residential_proxy1"  # 通道用户名PROXY_PASS = "mq2tfjmm5t9d"       # 通道密码
复制代码


3.1.3 代码集成代理

这里需要替换为你自己的信息即可

{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}


# 构建代理隧道proxies = {    "http": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",    "https": f"https://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"} # 验证代理有效性def is_proxy_valid():    try:        response = requests.get(            "https://api64.ipify.org?format=json",            proxies=proxies,            timeout=5        )        print(f"Current Proxy IP: {response.text}")        return response.status_code == 200    except Exception as e:        print(f"Proxy validation failed: {str(e)}")        return False
复制代码


3.1.4 高级配置优化

1. 设备指纹伪装


   headers = {       "User-Agent": random.choice([           "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",           "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"       ]),       "Accept-Language": "en-US,en;q=0.9"   }
复制代码


2. 地理位置筛选


   # 通过URL参数指定地域   proxies = {       "https": f"https://{PROXY_USER}-geo-us:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"   }
复制代码


通过以上步骤,可快速构建稳定的动态住宅代理环境,有效突破学术数据库反爬限制。

3.2 Web Scraper API

如果觉得自己写代码效率不高,可以使用这个API ,开箱即用,支持海量的数据拉取。目前使用 75 折,很划算。

简单来说,这个工具就像给 AI 模型训练数据采集装了个「超级外挂」

注册成功之后可以看到

 

搜索需要的数据之后


按照步骤配置完成之后,可以看到你选择的数据示例:


3.2.1 代码实现

进入控制台 → Web Scraper → 获取 API 密钥 python


API_KEY = "your_api_key"  # 从控制台复制
复制代码


3.2.2 基本请求示例


import requests API_URL = "https://scraper-api.brightdata.com" def fetch_pubmed_article(article_id):    params = {        "url": f"https://pubmed.ncbi.nlm.nih.gov/{article_id}/",        "output": "json",        "geo": "us",        "parse": "pubmed_article"    }        response = requests.get(        API_URL,        params=params,        auth=(API_KEY, '')  # 认证方式1:URL参数    )        return response.json() # 使用示例data = fetch_pubmed_article("37000000")print(data["title"])
复制代码


3.2.3 高级参数配置


# 完整参数列表params = {    "url": "https://url.com",# 指定采集url    "output": "json",  # 支持json, csv, html    "geo": "us",      # 指定采集地域    "parse": "default",# 选择解析模板    "javascript": "enabled", # 启用JS渲染    "timeout": 30,     # 超时时间(秒)    "premium_proxy": "true" # 使用高级代理}
复制代码


3.2.4 预构建爬虫模板

我也有试了一下这个 API,确实挺方便的减少很多代码量


# 支持的典型站点示例SUPPORTED_SITES = [    "pubmed.ncbi.nlm.nih.gov",    "www.ncbi.nlm.nih.gov/pmc",    "www.ebi.ac.uk/proteins",    "www.biorxiv.org"]
复制代码


开箱即用的解析器:自动提取结构化数据 python


# 解析PubMed文章元数据params = {    "url": "https://pubmed.ncbi.nlm.nih.gov/37000000/",    "parse": "pubmed_article"}
复制代码


3.3 智能请求调度

另外在代码中也可以加上智能请求调度的配置,用来退避请求控制


# 带指数退避的请求控制def schedule_request(attempt=1):    max_attempts = 5    delay = 2 ** attempt + random.uniform(0, 1)        if attempt > max_attempts:        raise Exception("Max attempts exceeded")        time.sleep(delay)    return attempt + 1
复制代码


3.4 多线程采集优化

使用线程池并发采集,采集效率更高


# 使用线程池并发采集from concurrent.futures import ThreadPoolExecutor def process_pdb_id(pdb_id):    attempt = 1    while attempt <= 3:        try:            success = fetch_pdb_structure(pdb_id, proxies)            if success:                print(f"Success: {pdb_id}")                return            else:                attempt = schedule_request(attempt)        except Exception as e:            print(f"Error processing {pdb_id}: {str(e)}")            attempt = schedule_request(attempt) # 启动10线程并发with ThreadPoolExecutor(max_workers=10) as executor:    executor.map(process_pdb_id, pdb_ids)
复制代码


四、数据质量保障

4.1 数据格式验证

 

# PDB文件验证脚本from Bio.PDB import PDBParser def validate_pdb_file(file_path):    try:        parser = PDBParser(QUIET=True)        structure = parser.get_structure("test", file_path)        return len(list(structure.get_atoms())) > 0    except Exception as e:        return False
复制代码


4.2 学术合规处理


# 添加请求延迟遵守数据库条款import time def polite_request():    time.sleep(1)  # 至少1秒间隔
复制代码


五、性能优化与效果对比

5.1 优化策略对比


5.2 关键技术点

1. 代理网络动态切换:基于地理位置的智能节点选择

2. 请求指纹随机化


   headers = {       "User-Agent": random.choice([           "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",           "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"       ])   }
复制代码

3. 数据清洗流水线


   def clean_pdb_data(data):       return [atom for atom in data if atom.get_full_id()[3][0] != 'W']
复制代码


六、学术合规与风险控制

6.1 数据库 API 优先


# 使用PDB API获取数据response = requests.get(    "https://data.rcsb.org/rest/v1/core/entry/1A2B",    headers={"Accept": "application/json"})
复制代码


6.2 伦理审查机制

1. 确保数据不涉及人类受试者隐私

2. 添加数据使用声明:


   print("This data is used for academic research purposes only.")
复制代码


通过综合运用反爬对抗技术与生物信息学工具,成功构建了包含 10 万+蛋白质结构的训练集,使 AI 大模型在蛋白质-配体结合预测任务上的准确率提升了 7.3%。另外在应用中还需要持续监控目标数据库的 API 更新和反爬策略变化,保持采集系统的灵活性。


用户头像

颜淡慕潇

关注

欢颜如炼,悲苦如戟; 浓尽必枯,淡者屡深 2019-04-14 加入

后端技术领域

评论

发布
暂无评论
生物医药蛋白分子数据采集:支撑大模型训练的技术实践分享_网络协议_颜淡慕潇_InfoQ写作社区