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?

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top