
在现代web应用中,许多网站为了提供更丰富的用户体验,会采用javascript动态加载内容。这意味着当您使用requests库获取一个网页的html内容时,它可能只返回初始的、未经过javascript渲染的html骨架。页面的实际数据(如uniprot搜索结果中的条目id)往往是在浏览器加载完初始html后,通过javascript向后端api发出请求,再将获取的数据填充到页面中。
例如,以下代码尝试通过requests和BeautifulSoup从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")
# 尝试查找具有特定class的链接元素
links = soup.find_all("a", class_="BqBnJ")
uniprot_ids = [link.get_text(strip=True) for link in links]
for uniprot_id in uniprot_ids:
print(uniprot_id)
# 预期会返回一个空列表,因为数据尚未被BeautifulSoup“看到”
print(f"找到的UniProt ID数量: {len(uniprot_ids)}")这段代码执行后会发现links列表为空,即使res.text确实包含了页面的初始HTML。这是因为BeautifulSoup解析的是requests获取到的原始HTML字符串,而UniProt页面上带有class="BqBnJ"的<a>标签及其包含的条目ID,是在页面加载完成后由JavaScript异步请求数据并渲染到DOM中的。因此,传统的静态HTML解析方法无法捕获这些动态生成的内容。
为了克服动态网页抓取的局限性,并更高效、稳定地获取生物信息数据,最佳实践是利用UniProt官方提供的RESTful API。API(Application Programming Interface)是网站或服务提供给外部程序访问其数据和功能的接口。UniProt的REST API提供了结构化、易于解析的数据,避免了前端页面结构变化可能导致的抓取失败问题。
UniProt REST API的主要优势包括:
下面将介绍两种利用UniProt REST API获取条目ID的方法。
UniProt提供了一个搜索API端点,允许用户通过各种参数进行精确查询,并指定返回的数据字段。这是获取特定搜索结果条目ID的常用方法。
API端点: https://rest.uniprot.org/uniprotkb/search
关键参数:
示例代码:
import requests
import json
api_url = "https://rest.uniprot.org/uniprotkb/search"
params = {
"fields": "accession,reviewed,id,protein_name,gene_names,organism_name,length",
"query": "(wound healing)",
}
try:
response = requests.get(api_url, params=params)
response.raise_for_status() # 检查HTTP请求是否成功
data = response.json()
print("通过搜索接口获取的UniProt条目ID:")
for r in data.get("results", []):
print(r["primaryAccession"])
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except json.JSONDecodeError as e:
print(f"JSON解析失败: {e}")
输出示例:
O00622 Q15746 Q04912 P08581 Q61176 Q9VKV5 ...
这段代码直接向UniProt的搜索API发送请求,并指定了查询关键词和需要返回的字段。API返回的数据是JSON格式,我们可以轻松地遍历results列表,提取每个条目的primaryAccession字段,这就是我们所需的UniProt条目ID。
如果需要获取某个查询的所有结果,UniProt还提供了模拟“下载”功能的流式API端点。这个端点通常用于获取大量数据,可以指定下载格式(如JSON、FASTA等)。
API端点: https://rest.uniprot.org/uniprotkb/stream
关键参数:
示例代码:
import requests
import json
api_url = "https://rest.uniprot.org/uniprotkb/stream"
params = {
"compressed": "false",
"download": "true",
"format": "json",
"query": "(wound healing)",
}
try:
response = requests.get(api_url, params=params)
response.raise_for_status() # 检查HTTP请求是否成功
data = response.json()
print("\n通过模拟下载流接口获取的UniProt条目ID:")
for r in data.get("results", []):
print(r["primaryAccession"])
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except json.JSONDecodeError as e:
print(f"JSON解析失败: {e}")输出示例:
O00622 Q15746 Q04912 P08581 Q61176 Q9VKV5 ...
此方法与第一个方法类似,但更侧重于获取完整的结果集,其返回结构也是一个包含results列表的JSON对象,每个结果中同样包含primaryAccession字段。
在使用UniProt REST API时,请注意以下几点:
从UniProt等动态加载内容的网站抓取数据时,传统的requests结合BeautifulSoup方法往往会失效,因为它们无法执行JavaScript并渲染页面。此时,利用网站提供的官方REST API是获取数据的最佳、最可靠途径。UniProt的REST API提供了强大的功能,允许用户以结构化、高效的方式查询和下载生物序列数据。通过掌握API的使用,不仅能解决动态网页抓取难题,还能为生物信息学研究和数据分析工作打下坚实的基础。
以上就是UniProt动态内容抓取:利用REST API高效获取生物序列条目ID教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号