之前用于查询 UniProt ID 映射的代码出现 HTTP 错误 405

问题描述 投票:0回答:2

在我的一个脚本中,我使用以下代码块来使用另一种类型的 ID 来查询蛋白质的 ID:

import os
import sys
import urllib.request

uniprot = 'A0A0M3KKX3'
url = 'https://www.uniprot.org/uploadlists/'
params = {
'from': 'ACC',
'to': 'PDB_ID',
'format': 'tab',
'query': uniprot,
'species': 'human'
     }

dat = urllib.parse.urlencode(params)
dat = dat.encode('utf-8')
req = urllib.request.Request(url, dat)
with urllib.request.urlopen(req) as f:
    response = f.read()

在过去的几个月里,涉及此方法的代码运行可靠,使我能够在这些功能的基础上构建我的算法。然而,截至昨晚,运行相同的代码,我收到以下错误:

Traceback (most recent call last):
  File "\\wsl.localhost\Ubuntu\home\defrondevillec\FASTAtest.py", line 21, in <module>
    with urllib.request.urlopen(req) as f:
  File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 525, in open
    response = meth(req, response)
  File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 634, in http_response
    response = self.parent.error(
  File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 563, in error
    return self._call_chain(*args)
  File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 643, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 405: Not Allowed

我该如何解决这个问题?

python http web-scraping urllib
2个回答
1
投票

我刚刚遇到了同样的问题 - Uniprot 推出了新网站和一系列服务。目前旧的可以在

legacy.uniprot.org

购买

短期修复

使用

https://legacy.uniprot.org/uploadlists/
作为代码中的 URL。这在我的代码中用于类似的查询(uniprotID -> 基因名称)

长期修复

可能最好迁移到新的 ID 映射服务,该服务记录在此处: https://www.uniprot.org/help/id_mapping

您现在需要发出 ID 映射请求,该请求返回作业 ID,然后轮询结果,文档底部有一些示例 python 代码:https://www.uniprot.org/help/ id_mapping#python-example(转载如下)

import requests
import time
import json

POLLING_INTERVAL = 3
API_URL = "https://rest.uniprot.org"


def submit_id_mapping(fromDB, toDB, ids):
    r = requests.post(
        f"{API_URL}/idmapping/run", data={"from": fromDB, "to": toDB, "ids": ids},
    )
    r.raise_for_status()
    return r.json()["jobId"]


def get_id_mapping_results(job_id):
    while True:
        r = requests.get(f"{API_URL}/idmapping/status/{job_id}")
        r.raise_for_status()
        job = r.json()
        if "jobStatus" in job:
            if job["jobStatus"] == "RUNNING":
                print(f"Retrying in {POLLING_INTERVAL}s")
                time.sleep(POLLING_INTERVAL)
            else:
                raise Exception(job["jobStatus"])
        else:
            return job


job_id = submit_id_mapping(
    fromDB="UniProtKB_AC-ID", toDB="ChEMBL", ids=["P05067", "P12345"]
)
results = get_id_mapping_results(job_id)
print(json.dumps(results, indent=2))

0
投票

您现在可以使用 Michael Milton (@multimeric) 的 Unipressed 包在 Python 中进行 ID 映射,请参阅公告。该软件包还适用于 UniProt 2022 年的新 REST API。

使用 Unipressed 的原始帖子示例:

from unipressed import IdMappingClient
request = IdMappingClient.submit(
    source="UniProtKB_AC-ID", dest="PDB", ids={"A0A0M3KKX3"}
)
list(request.each_result())

结果:

[{'from': 'A0A0M3KKX3', 'to': '4U7N'},
 {'from': 'A0A0M3KKX3', 'to': '4U7O'},
 {'from': 'A0A0M3KKX3', 'to': '4ZKI'}]

参见使用它将三个人类基因 ID 映射到 UniProt 标识符/登录代码的示例此处。该帖子还包含有关 Unpressed 套餐的更多信息以及锻炼

source
和目的地 (
dest
) 详细信息的建议的链接。

查看更多使用 Unipressed 访问 Uniprot 的新 REST API 的示例 在我对 Biostar 帖子“使用 REST API 访问 UNIPROT”的回复中,以及底部包括根据“从 - 到”结果制作 Pandas 数据帧.

更新:我制作了一个存储库,允许直接在浏览器中运行此示例和其他 Unpressed 示例,而无需在计算机上安装任何内容。要开始使用,请转到此处并单击任何“

launch binder
”徽章。

© www.soinside.com 2019 - 2024. All rights reserved.