如何在重定向后获取最终目的地URL



我正在尝试使用Django自定义管理命令测试模型中的有效URL。我有下面的模型,我需要测试是否有不活动的URL(HTTP404错误(。

class Association(models.Model):
name = models.CharField(max_length=25, blank=True, null=False)
publication_doi_url = models.TextField(blank=True)

有些URL具有多个重定向;因此,我编写了一个函数来获取最终的URL。它主要起作用,但很少起作用。例如,URLhttps://doi.org/10.1603/EC11207重定向将其显示为最终URLhttps://academic.oup.com/jee/article-lookup/doi/10.1603/EC11207.然而,这返回的HTTP响应代码是302。还有一个重定向。如何获取最终URL?我认为期刊允许基于IP的访问。该网站不需要用户名/密码。任何指针都会有所帮助。


def return_final_url(url_link):
response = requests.get(url_link)
finalurl = ''
if response.history:
for resp in response.history:
pass
finalurl = response.url
return finalurl

class Command(BaseCommand):
help = 'Prints inactive urls (HTTP 404 error)'
def handle(self, *args, **kwargs):
for item in Association.objects.all():
base_url = "https://doi.org/"
url = base_url + item.publication
finalurl = return_final_url(url)
print("finalurl", finalurl)
response = requests.get(finalurl)
try:
response.raise_for_status()
except requests.exceptions.HTTPError:
print("HTTPError")

首先可以查看本章https://docs.python-requests.org/en/master/user/quickstart/#redirection-和历史,在那里你可以找到重定向背后的逻辑。

r = requests.get('http://original.url/')
>>> r.url
'https://redirected.url/'
>>> r.history
[<Response [301]>]

请看以下段落:

如果请求超过配置的最大重定向次数,则会引发TooManyRedirects异常。

引发此错误的次数限制为30次。

最新更新