0

0

高效获取UniProt数据库条目ID:应对动态加载与API应用实践

聖光之護

聖光之護

发布时间:2025-08-28 15:22:00

|

445人浏览过

|

来源于php中文网

原创

高效获取UniProt数据库条目ID:应对动态加载与API应用实践

本教程旨在解决从UniProt网站抓取条目ID时,因页面内容动态加载导致传统BeautifulSoup解析失败的问题。我们将深入分析失败原因,并提供一个更稳定、高效的解决方案:利用UniProt官方REST API直接获取所需数据,避免复杂的网页解析,确保数据提取的准确性和可靠性。

网页动态加载内容的挑战

在进行网页数据抓取时,开发者常会遇到一个普遍问题:尽管通过requests库成功获取了网页的html内容,但使用beautifulsoup等解析库却无法找到页面上明显存在的元素。这通常是因为目标网站采用了javascript动态加载内容的技术。这意味着当您使用requests.get()请求页面时,服务器返回的html文档可能只包含一个基础框架,而实际的数据(例如uniprot的条目id列表)是在浏览器端通过javascript执行异步请求(ajax/fetch)后才填充到页面中的。

对于UniProt网站,当我们尝试使用以下代码来提取条目ID时:

import requests
from bs4 import BeautifulSoup

url = "https://www.uniprot.org/uniprotkb?query=wound+healing"
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")

links = soup.find_all("a", class_="BqBnJ")
# 此时 links 将是一个空列表,因为包含 ID 的内容尚未加载

尽管print(res.text)能够显示HTML文本,但其中并不包含那些动态加载的标签。这是因为requests库只获取了服务器的原始响应,并未执行任何JavaScript代码。因此,BeautifulSoup在解析这个初始HTML时,自然无法找到动态生成的内容。

解决方案:利用UniProt REST API

面对动态加载内容,最稳健且推荐的解决方案是使用网站提供的官方API(Application Programming Interface)。API是网站为了方便开发者程序化访问其数据而设计的一套接口。UniProt提供了一个功能强大的REST API,允许用户直接查询和获取蛋白质数据,而无需进行网页解析。

1. 通过REST API进行基本搜索和ID提取

UniProt REST API的/uniprotkb/search端点允许我们根据查询条件搜索蛋白质条目,并指定需要返回的字段。这比模拟浏览器行为抓取网页要高效和稳定得多。

以下代码演示了如何使用UniProt REST API来搜索“wound healing”相关的条目,并提取它们的“primaryAccession”(即UniProt ID):

import requests
import json # 用于处理JSON响应

api_url = "https://rest.uniprot.org/uniprotkb/search"

# 定义查询参数
params = {
    "fields": "accession,id,protein_name,gene_names,organism_name,length", # 指定需要返回的字段
    "query": "(wound healing)", # 查询字符串
    "size": 5 # 限制返回结果的数量,便于演示
}

try:
    # 发送GET请求到API
    response = requests.get(api_url, params=params)
    response.raise_for_status() # 检查请求是否成功(状态码200)

    # 解析JSON响应
    data = response.json()

    print("--- 提取的UniProt条目ID ---")
    if "results" in data and data["results"]:
        for r in data["results"]:
            print(r["primaryAccession"])
    else:
        print("未找到匹配的条目。")

except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
except json.JSONDecodeError:
    print("无法解析API响应为JSON。")

代码解析:

简单听记
简单听记

百度网盘推出的一款AI语音转文字工具

下载
  • api_url: UniProt搜索API的基地址。
  • params: 一个字典,包含了API请求的各种参数。
    • fields: 指定您希望从每个条目中获取哪些信息,例如accession(主登录号,即ID)、id(条目ID)、protein_name等。
    • query: 您的搜索关键词。
    • size: 可选参数,用于限制返回结果的数量。
  • requests.get(api_url, params=params): 发送带有指定参数的GET请求。
  • response.raise_for_status(): 如果HTTP请求返回了错误状态码(如4xx或5xx),将抛出HTTPError异常。
  • response.json(): 将API返回的JSON格式数据解析为Python字典。
  • data["results"]: UniProt API的响应通常包含一个results列表,其中每个元素代表一个匹配的蛋白质条目。
  • r["primaryAccession"]: 从每个条目字典中提取primaryAccession字段,这就是我们需要的UniProt ID。

示例输出:

--- 提取的UniProt条目ID ---
O00622
Q15746
Q04912
P08581
Q61176

2. 模拟“下载”功能进行批量数据流式获取

UniProt API还提供了/uniprotkb/stream端点,它更适合于批量下载大量数据,类似于网站上的“下载”按钮功能。通过这个端点,您可以指定下载格式(如JSON、FASTA、TXT等)和是否压缩。

以下代码展示了如何使用/stream端点来获取“wound healing”查询的所有结果,并以JSON格式返回:

import requests
import json

api_url_stream = "https://rest.uniprot.org/uniprotkb/stream"

# 定义流式下载参数
params_stream = {
    "compressed": "false", # 不压缩
    "download": "true",    # 模拟下载行为
    "format": "json",      # 指定下载格式为JSON
    "query": "(wound healing)",
    "size": 5 # 限制返回结果的数量,便于演示
}

try:
    # 发送GET请求到API
    response_stream = requests.get(api_url_stream, params=params_stream)
    response_stream.raise_for_status()

    # 解析JSON响应
    data_stream = response_stream.json()

    print("\n--- 通过流式API提取的UniProt条目ID ---")
    if "results" in data_stream and data_stream["results"]:
        for r in data_stream["results"]:
            print(r["primaryAccession"])
    else:
        print("未通过流式API找到匹配的条目。")

except requests.exceptions.RequestException as e:
    print(f"流式请求失败: {e}")
except json.JSONDecodeError:
    print("无法解析流式API响应为JSON。")

代码解析:

  • api_url_stream: UniProt流式API的基地址。
  • params_stream:
    • compressed: 是否压缩返回数据。
    • download: 设为true以模拟下载。
    • format: 指定输出格式,这里是json
  • 其余部分与基本搜索类似,都是处理JSON响应并提取primaryAccession。

注意事项与最佳实践

  1. 优先使用官方API: 当目标网站提供API时,始终优先选择API而非网页抓取。API通常更稳定、数据结构化、且不易受到网站UI变动的影响。
  2. 查阅API文档: 在使用任何API之前,务必详细阅读其官方文档。文档会说明可用的端点、参数、返回格式、认证方式(如果需要)、以及重要的速率限制(Rate Limit)。了解速率限制对于避免IP被封锁至关重要。
  3. 错误处理: 在实际应用中,务必添加健壮的错误处理机制,例如使用try-except块来捕获网络请求失败、JSON解析失败等异常。
  4. 识别动态内容: 如果您不确定某个网站的内容是否是动态加载的,可以使用浏览器的开发者工具。在“Network”(网络)选项卡中,刷新页面并观察是否有XHR或Fetch请求加载了您所需的数据。这些请求的URL通常就是您可以直接调用的API端点。
  5. 遵守服务条款: 在进行任何数据抓取或API调用时,请务必遵守网站的服务条款和使用政策。

总结

通过本教程,我们理解了传统网页抓取方法在面对JavaScript动态加载内容时的局限性,并掌握了利用UniProt REST API高效、稳定地获取蛋白质条目ID的方法。这种方法不仅解决了动态内容的问题,还提供了更结构化、更易于处理的数据。在未来的数据获取任务中,识别动态内容并优先考虑使用官方API将是您提升效率和代码鲁棒性的关键。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

715

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

698

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

0

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 1.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号