URL busca demasiadas redirecciones repetidas
-
28-10-2019 - |
Pregunta
Estoy tratando de cargar una URL y obtengo este error:
DownloadError: ApplicationError: 2 Demasiadas redireccionamientos repetidos
Este es el código que estoy usando:
headers = { 'User-Agent' : 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1' }
url = "http://www.cafebonappetit.com/menu/your-cafe/collins-cmc/cafes/details/50/collins-bistro"
cmcHTM = urlfetch.fetch(url=url)
cmcHTML = str(cmcHTM.content)
Reviso las redirecciones de este sitio web en: http://www.internetofficer.com/seo-tool/redirect-check/¡Y descubrí que este sitio está redirigido a sí mismo! Entonces URL Fetch parece estar en círculos tratando de cargar esta página. Mientras tanto, esta página se carga bien en mi navegador.
Así que intenté usar este código:
cmcHTM = urlfetch.fetch(url=url,
follow_redirects=False,
deadline=100
)
Sin embargo, esto no devuelve nada. ¿Hay alguna forma de obtener este HTML?
Solución
Lo siento por la respuesta demorada. Encontré esto que funcionó:
import urllib, urllib2, Cookie
from google.appengine.api import urlfetch
class URLOpener:
def __init__(self):
self.cookie = Cookie.SimpleCookie()
def open(self, url, data = None):
if data is None:
method = urlfetch.GET
else:
method = urlfetch.POST
while url is not None:
response = urlfetch.fetch(url=url,
payload=data,
method=method,
headers=self._getHeaders(self.cookie),
allow_truncated=False,
follow_redirects=False,
deadline=10
)
data = None # Next request will be a get, so no need to send the data again.
method = urlfetch.GET
self.cookie.load(response.headers.get('set-cookie', '')) # Load the cookies from the response
url = response.headers.get('location')
return response
def _getHeaders(self, cookie):
headers = {
'Host' : 'www.google.com',
'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)',
'Cookie' : self._makeCookieHeader(cookie)
}
return headers
def _makeCookieHeader(self, cookie):
cookieHeader = ""
for value in cookie.values():
cookieHeader += "%s=%s; " % (value.key, value.value)
return cookieHeader
Supongo que la clave es el bucle While: siguiendo las redirecciones basadas en el encabezado de retorno ...
Otros consejos
Creo que esto es un problema en el sitio, no en su código. El sitio parece diseñado, por lo que se redirige a sí mismo cuando no detecta algún encabezado que habitualmente es enviado por un navegador. Por ejemplo, cuando intento acceder a él con curl, obtengo un cuerpo vacío con una redirección 302 para sí misma, pero en el navegador obtengo una página. Tendría que preguntarle al propietario del sitio por qué están revisando ...