解决原正常运行的UniProt ID映射Python代码出现的HTTP Error 405问题
解决Uniprot接口HTTP Error 405: Not Allowed问题
这个405错误说明Uniprot的uploadlists接口现在不接受你当前使用的POST请求方式,或者你的请求缺少必要的标识被服务器拦截了。下面给你两个可行的修复方案:
方案1:改用GET请求方式
Uniprot的上传列表接口支持通过GET请求传递参数,把参数直接拼接到URL后即可,这种方式更符合公共API的常规使用习惯,也能避开POST请求的限制。修改后的代码如下:
import urllib.request import urllib.parse uniprot = 'A0A0M3KKX3' url = 'https://www.uniprot.org/uploadlists/' params = { 'from': 'ACC', 'to': 'PDB_ID', 'format': 'tab', 'query': uniprot, 'species': 'human' } # 将参数编码后拼接到URL末尾 full_url = f"{url}?{urllib.parse.urlencode(params)}" # 发送GET请求并读取响应 with urllib.request.urlopen(full_url) as f: response = f.read().decode('utf-8') # 解码为字符串方便后续处理 print(response)
方案2:保留POST请求但添加User-Agent头
如果必须使用POST请求,问题很可能出在默认的请求头没有标识,被Uniprot的反爬虫机制拦截了。给请求添加一个模拟浏览器的User-Agent即可:
import urllib.request import urllib.parse 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).encode('utf-8') req = urllib.request.Request(url, dat) # 添加模拟浏览器的User-Agent请求头 req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36') with urllib.request.urlopen(req) as f: response = f.read().decode('utf-8') print(response)
问题根源说明
Uniprot大概率最近更新了API的访问策略:要么限制了POST请求的使用场景,要么加强了反爬虫规则,拒绝无合理标识的请求。这类公共API会定期调整规则来控制流量或防止滥用,之前稳定的代码突然报错就是这个原因。
建议优先选择方案1,GET请求更直观且不易触发访问限制。如果后续仍有问题,可以参考Uniprot官方文档确认最新的接口规范。
内容的提问来源于stack exchange,提问作者Christian de Frondeville
相关产品推荐
相关产品推荐

