重定向后如何获取最终目标 URL?

时间:2021-04-14 20:55:46

标签: django python-requests django-custom-manager

我正在尝试使用 Django 自定义管理命令在我的模型中测试有效的 URL。我有以下模型,我需要测试是否有无效的 URL(HTTP 404 错误)。

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

有些网址有多个重定向;因此我写了一个函数来获取最终的 URL。它主要工作,除了少数。例如,URL https://doi.org/10.1603/EC11207 重定向将其显示为最终 URL https://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")

1 个答案:

答案 0 :(得分:0)

首先,您可以查看本章 https://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history,您可以在其中了解重定向背后的逻辑。

r = requests.get('http://original.url/')

>>> r.url
'https://redirected.url/'

>>> r.history
[<Response [301]>]

请看下面的段落:

<块引用>

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

引发此错误的限制为 30 times