A biblioteca Python Requests redireciona o novo url


95

Estive olhando a documentação de solicitações do Python, mas não consigo ver nenhuma funcionalidade para o que estou tentando alcançar.

No meu script estou configurando allow_redirects=True.

Gostaria de saber se a página foi redirecionada para outra coisa, qual é a nova URL.

Por exemplo, se o URL inicial fosse: www.google.com/redirect

E o URL final é www.google.co.uk/redirected

Como faço para obter esse URL?


Confira esta resposta para lidar com urllib2
horcrux

Respostas:


156

Você está procurando o histórico de solicitações .

O response.historyatributo é uma lista de respostas que levam ao URL final, que pode ser encontrada em response.url.

response = requests.get(someurl)
if response.history:
    print("Request was redirected")
    for resp in response.history:
        print(resp.status_code, resp.url)
    print("Final destination:")
    print(response.status_code, response.url)
else:
    print("Request was not redirected")

Demo:

>>> import requests
>>> response = requests.get('http://httpbin.org/redirect/3')
>>> response.history
(<Response [302]>, <Response [302]>, <Response [302]>)
>>> for resp in response.history:
...     print(resp.status_code, resp.url)
... 
302 http://httpbin.org/redirect/3
302 http://httpbin.org/redirect/2
302 http://httpbin.org/redirect/1
>>> print(response.status_code, response.url)
200 http://httpbin.org/get

67

Isso está respondendo a uma pergunta um pouco diferente, mas como também fiquei preso nisso, espero que possa ser útil para outra pessoa.

Se você deseja usar allow_redirects=Falsee ir diretamente para o primeiro objeto de redirecionamento, em vez de seguir uma cadeia deles, e deseja apenas obter o local de redirecionamento diretamente do objeto de resposta 302, r.urlisso não funcionará. Em vez disso, é o cabeçalho "Local":

r = requests.get('http://github.com/', allow_redirects=False)
r.status_code  # 302
r.url  # http://github.com, not https.
r.headers['Location']  # https://github.com/ -- the redirect destination

Obrigado - isso aumentou meu script de referência de URL (que tinha milhares de urls) em vários segundos.
ahinkle

Você sabe o que está acontecendo r.next? Achei que conteria um PreparedRequestapontando para o URL de redirecionamento, mas não parece ser o caso ...
Elias Strehle


32

Acho que request.head em vez de requests.get será mais seguro chamar ao lidar com o redirecionamento de url, verifique o problema do github aqui :

r = requests.head(url, allow_redirects=True)
print(r.url)

1
Esta deve ser a resposta aceita. Curto e grosso.
Volatil3,

5
@ Volatil3: Nem todos os servidores respondem a uma solicitação HEAD da mesma forma que responderiam a um GET.
Blender

9

Para python3.5, você pode usar o seguinte código:

import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)

esta é a resposta correta para Python 3.5, demorei um pouco para encontrar, obrigado
jjj
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.