我试图通过请求库取消删除URL。我现在正在做这样的事情:
import requests
from contextlib import closing
def unshorten(url):
session = requests.session()
with closing(session.head(url)) as req:
r = req
if not r.headers.get('location'): # not a redirect
return url
tmp_url = url
try:
for redir in session.resolve_redirects(r, r.request):
if redir.status_code == 200 and not url_no_good(redir.url): # ok!
return redir.url
else:
tmp_url = redir.url
else: # no acceptable responses :(
return tmp_url
except requests.exceptions.TooManyRedirects:
return url
(url_no_good是一些测试的简写,以确保网址不是,例如,DNS介导的404页面)
我遇到了一个问题,即某个网址会重定向到一个不再有效的网站。我不想要缩短的链接,我想要的是“不好的”。网址。我解决了#39;这个用
ERR_PAT = re.compile(r'host=\'([\w\d\.]+)\'')
...
try:
for redir in session.resolve_redirects(r, r.request):
...
except requests.exceptions.TooManyRedirects:
return url
except requests.exceptions.ConnectionError as e:
return 'http://' + re.search(ERR_PAT, e.message.message).group(1) + e.message.url
因为,对于请求ConnectionError,err.message.message
是错误的字符串表示,err.message.url
是网址的非域部分,例如/foo/bar?baz=bloo
。将错误消息的不同部分拼凑在一起感觉令人难以置信的 hacky,我真的很好奇是否有一种不那么复杂的方式来处理这种事情。
答案 0 :(得分:0)
当引发该异常时,redir
仍然绑定到您尝试遵循重定向的最后一个请求:
try:
redir = r # in case the first redirect fails
for redir in session.resolve_redirects(r, r.request):
if redir.status_code == 200 and not url_no_good(redir.url): # ok!
return redir.url
else:
tmp_url = redir.url
else: # no acceptable responses :(
return tmp_url
except requests.exceptions.TooManyRedirects:
return url
except requests.exceptions.ConnectionError:
return redir.headers.get('location', url)