如何在Python中从响应头获取Location?CLI种子搜索器报错求助
解决1337x Magnet链接提取时的InvalidSchema错误
问题场景
开发CLI种子搜索器时,针对1337x来源的资源,尝试通过请求跳转链接提取Magnet地址,运行代码时触发requests.exceptions.InvalidSchema错误。
原代码片段:
if "1337x" in data[x]['source']: re = requests.get(f"https://{site}/{data[x]['magnet']}") magnet = re.headers[upper('location')] subprocess.run(["xdg-open", magnet])
错误信息:
Traceback (most recent call last): File "/home/l/Projects/getTorrents/./torrentcli", line 35, in <module> re = requests.get(f"https://{site}/{data[x]['magnet']}") File "/usr/lib/python3.10/site-packages/requests/api.py", line 73, in get return request("get", url, params=params, **kwargs) File "/usr/lib/python3.10/site-packages/requests/api.py", line 59, in request return session.request(method=method, url=url, **kwargs) File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 587, in request resp = self.send(prep, **send_kwargs) File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 723, in send history = [resp for resp in gen] File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 723, in <listcomp> history = [resp for resp in gen] File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 266, in resolve_redirects resp = self.send( File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 695, in send adapter = self.get_adapter(url=request.url) File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 792, in get_adapter raise InvalidSchema(f"No connection adapters were found for {url!r}") requests.exceptions.InvalidSchema: No connection adapters were found for 'magnet:?xt=foobar
错误原因
- 自动重定向触发不支持的协议:requests默认会自动跟随重定向,当请求的1337x跳转链接指向
magnet:协议地址时,requests没有对应的适配器处理该协议,直接报错。 - 变量名冲突:使用
re作为请求响应变量名,覆盖了Python内置的正则模块re,存在潜在问题。 - Header获取方式错误:
upper('location')写法错误,应该是'location'.upper(),且HTTP响应头不区分大小写,直接用小写键更稳妥。 - 缺少异常处理:未处理响应中不存在
Location头的情况,可能导致KeyError。
修复方案
修改代码时需要:
- 禁用自动重定向,获取初始响应的
Location头 - 避免变量名冲突
- 安全获取响应头
- 增加基础异常处理
修改后的代码:
import requests import subprocess # 假设data、x、site已定义 if "1337x" in data[x]['source']: # 禁用自动重定向,避免requests尝试处理magnet协议 resp = requests.get(f"https://{site}/{data[x]['magnet']}", allow_redirects=False) # 安全获取Location头,不区分大小写,默认返回None magnet = resp.headers.get('location') if magnet: subprocess.run(["xdg-open", magnet]) else: print("无法获取Magnet链接") else: # 处理非1337x来源的逻辑 print("非1337x来源,跳过处理")
关键修改说明
allow_redirects=False:阻止requests自动跟随重定向,这样就能在初始响应中拿到指向magnet链接的Location头,而不会让requests尝试请求magnet协议地址。resp.headers.get('location'):使用get方法获取头信息,避免KeyError,同时HTTP头不区分大小写,直接用小写即可匹配。- 变量名改为
resp:避免覆盖内置模块re。 - 增加判断逻辑:确保magnet变量存在时再调用xdg-open,避免传入空值导致错误。
内容的提问来源于stack exchange,提问作者utlthpjh
相关产品推荐
相关产品推荐

