2010-01-27 18 views
16

Necesito rozar un sitio con python. Obtengo el código fuente html con el módulo urlib, pero también necesito raspar algún código html generado por una función javascript (que está incluida en la fuente html). Lo que hace que esto funcione "en" el sitio es que cuando presiona un botón, produce algún código html. ¿Cómo puedo "presionar" este botón con el código de Python? ¿Me puede ayudar el tratamiento? Capturé la solicitud POST con Firebug, pero cuando intento pasarla en la url obtengo un error 403. ¿Alguna sugerencia?scrape html generado por javascript con python

+2

Excavando las direcciones ofuscadas fuera de las páginas web para las listas de correo? –

+0

Respondí una pregunta similar sobre [Haga clic en un enlace javascript dentro de python?] (Http://stackoverflow.com/questions/5207948/click-on-a-javascript-link-within-python/5227031#5227031) –

Respuesta

10

En Python, creo que Selenium 1.0 es el camino a seguir. Es una biblioteca que le permite controlar un navegador web real desde su idioma de elección.

Debe tener el navegador web en cuestión instalado en la máquina en la que se ejecuta su secuencia de comandos, pero parece ser la forma más confiable de interrogar mediante programación a sitios web que utilizan una gran cantidad de JavaScript.

+0

Es hay una manera de hacerlo con las solicitudes y la hermosa sopa en sí? He estado usando solicitudes y funciona bien en cualquier otro caso pero esto. Por favor, avíseme si las solicitudes también pueden resolver esto. – Shaardool

+0

@Shaardool: ¿resolver qué? ¿Scraping HTML generado en el navegador por JavaScript? No, para eso necesita algo que ejecute JavaScript para que pueda producir el HTML. Beautiful Soup no ejecuta JavaScript. –

+0

gracias por la visión, ¿puede la Biblioteca de Solicitudes hacerlo?Funciona bien con las solicitudes de AJAX al servidor, pero quiero saber si puede funcionar con javascript que también crea HTML. Sin embargo, no encontré nada de eso en su documentación. – Shaardool

4

He tenido que hacer esto antes (en .NET) y básicamente vas a tener que alojar un navegador, hacer que haga clic en el botón, y luego consultar el DOM (modelo de objeto del documento) del navegador para obtener en el HTML generado.

Esto es definitivamente una de las desventajas de las aplicaciones web que se mueven hacia un enfoque Ajax/Javascript para generar HTML en el lado del cliente.

2

Para Scrapy (gran estructura de python scraping) hay scrapyjs: un gestor de descarga adicional/manejador de middleware capaz de raspar contenido generado por JavaScript.

Está basado en el motor de webkit de pygtk, python-webkit y python-jswebkit y es bastante simple.

6

Dado que no hay una respuesta completa aquí, voy a seguir adelante y escribir una.

para raspar JS rindió páginas, necesitaremos un navegador que tiene un motor de JavaScript (IE, JavaScript renderizado)

Opciones como Mecanización, url2lib no funcionará ya que ¡NO soporte JavaScript

Así que aquí es lo que haces:

Configuración PhantomJS para funcionar con Selenium. Después de instalar las dependencias para ambos (consulte this), puede usar el siguiente código como ejemplo para recuperar el sitio web completamente procesado.

from selenium import webdriver 

driver = webdriver.PhantomJS() 
driver.get('http://jokes.cc.com/') 
soupFromJokesCC = BeautifulSoup(driver.page_source) #page_source fetches page after rendering is complete 
driver.save_screenshot('screen.png') # save a screenshot to disk 

driver.quit() 
Cuestiones relacionadas