2012-07-12 14 views
8

Estoy aprendiendo a hacer raspadores web y quiero raspar TripAdvisor para un proyecto personal, agarrando el html usando urllib2. Sin embargo, me encuentro con un problema donde, utilizando el siguiente código, el html que recibo no es correcto ya que la página parece tardar un segundo en redirigirse (puede verificar esto visitando la url); en su lugar, obtengo el código de la página que inicialmente aparece brevemente.python urllib2 - ¿Espera a que la página termine de cargarse/redirigirse antes de raspar?

¿Hay algún comportamiento o parámetro para establecer para asegurarse de que la página haya terminado de cargar/redirigir completamente antes de obtener el contenido del sitio web?

import urllib2 
from bs4 import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
print soup.prettify() 

Editar: La respuesta es exhaustiva, sin embargo, al final lo que resolvió mi problema fue la siguiente: https://stackoverflow.com/a/3210737/1157283

+0

duerma urllib generará un error? hay un redirectdirector para tales casos ... –

+0

@DonQuestion Ningún error, acabo de obtener el html de la página que aparece brevemente antes de ser redirigido. Quiero el html de la página que aparece al final. ¿Qué es este redirectdirector, puedes elaborarlo? – Ken

+0

si está usando urlopen, está utilizando OpenerDirector.open() mira python-docs - desafortunadamente no se explica en 2-3 palabras :-(: http://docs.python.org/library/urllib2.html? highlight = urllib2 # urllib2.OpenerDirector –

Respuesta

5

Inreresting el problema no es una redirección es que la página modifica el contenido usando javascript, pero urllib2 no tiene un motor JS simplemente GETS de datos, si JavaScript desactivado en su navegador se dará cuenta de que las cargas básicamente el mismo contenido que lo vuelve urllib2

import urllib2 
from BeautifulSoup import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
open('test.html', 'w').write(soup.read()) 

test.html y deshabilitar JS en su navegador, lo más fácil en el contenido de Firefox -> desmarque la activación de JavaScript, genere conjuntos de resultados idénticos.

Entonces, ¿qué podemos hacer bien, lo primero que debe comprobar si el sitio ofrece una API, desguace tiende a fruncir el ceño hasta http://www.tripadvisor.com/help/what_type_of_tripadvisor_content_is_available

Travel/Hotel API's? parece que podría, aunque con algunas restricciones.

Pero si aún tenemos que rasparlo, con JS, entonces podemos usar seleniumhttp://seleniumhq.org/. Se usa principalmente para las pruebas, pero es fácil y tiene documentos bastante buenos.

También encontraron esta Scraping websites with Javascript enabled? y esta esperanza http://grep.codeconsult.ch/2007/02/24/crowbar-scrape-javascript-generated-pages-via-gecko-and-rest/

que ayuda.

Como nota al margen:

>>> import urllib2 
>>> from bs4 import BeautifulSoup 
>>> 
>>> bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
>>> value = bostonPage.read() 
>>> soup = BeautifulSoup(value) 
>>> open('test.html', 'w').write(value) 
+0

Gracias por su respuesta. Permítanme reiterar algo de eso: cuando hace clic en las diferentes categorías como "Lujo" o "Familias", los cambios que ve en la página se generan únicamente a través de javascript? (es decir, ¿el código de la página nunca cambia?) ¿Y qué necesito hacer es encontrar una herramienta que ejecute el JS y luego devolver ese contenido? ¿Qué es lo más fácil/lo mejor de lo que recomienda? Siento que una API es no es apropiado para lo que estoy tratando de hacer en este caso. – Ken

+0

selenio quizás la mejor manera de hacerlo, utiliza el navegador real aunque totalmente automatizado, pero como tal necesita un navegador instalado con al menos un frame-buffer virtual o un entorno de escritorio, ya que llamará a uno ... –

Cuestiones relacionadas