2010-02-03 19 views
15

¿Tiene Python bibliotecas de eliminación de pantalla que ofrecen compatibilidad con JavaScript?Filtrado de pantalla con Python

He estado usando pycurl para solicitudes simples HTML y Java HtmlUnit para solicitudes más complicados que requieren el soporte de JavaScript.

Idealmente, me gustaría poder hacer todo desde Python, pero no he encontrado ninguna biblioteca que me permita hacerlo. ¿Existen?

+4

Un montón de respuestas útiles sobre cuestiones similares aquí: http://stackoverflow.com/search?q=scraping+python – 3zzy

+1

Duplicado exacto: http://stackoverflow.com/questions/2081586/web-scraping-with-python –

+0

no es un duplicado exacto. Este menciona JavaScript, que requiere diferentes herramientas que cuando se trabaja con HTML estático. – hoju

Respuesta

12

hay muchas opciones cuando se trata de HTML estático, que cubren las otras respuestas. Sin embargo, si necesita soporte de JavaScript y desea permanecer en Python, le recomiendo usar webkit para renderizar la página web (incluido el JavaScript) y luego examinar el HTML resultante. Por ejemplo:

import sys 
import signal 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import QWebPage 

class Render(QWebPage): 
    def __init__(self, url): 
     self.app = QApplication(sys.argv) 
     QWebPage.__init__(self) 
     self.html = None 
     signal.signal(signal.SIGINT, signal.SIG_DFL) 
     self.connect(self, SIGNAL('loadFinished(bool)'), self._finished_loading) 
     self.mainFrame().load(QUrl(url)) 
     self.app.exec_() 

    def _finished_loading(self, result): 
     self.html = self.mainFrame().toHtml() 
     self.app.quit() 


if __name__ == '__main__': 
    try: 
     url = sys.argv[1] 
    except IndexError: 
     print 'Usage: %s url' % sys.argv[0] 
    else: 
     javascript_html = Render(url).html 
+0

Plumo: estoy tratando de usar este código para rozar un sitio web, pero no estoy seguro de qué hacer con la variable 'javascript_html' una vez que se devuelve. 'print javsascript_html' devuelve el error' UnicodeEncodeError: 'ascii' codec no puede codificar el carácter u '\ u2026' en la posición 4200: ordinal no en el rango (128) '. ¡por favor ayuda! :) – significance

+0

que es un error unicode – hoju

+0

Estoy intentando esto con Python 3, pero el html representado no tiene su Javascript procesado. Aquí está el código: [link] (http://pastebin.com/vzX9p7jv) – karmapolice

-2

No he encontrado nada para esto. Yo uso una combinación de beautifulsoup y rutinas personalizadas ...

0

puedes probar spidermonkey?

This Python module allows for the implementation of Javascript? classes, objects and functions in Python, as well as the evaluation and calling of Javascript scripts and functions. It borrows heavily from Claes Jacobssen's Javascript Perl module, which in turn is based on Mozilla's PerlConnect Perl binding.

+0

Spidermonkey no filtra la raspadura. – bdd

11

Beautiful soup sigue siendo probablemente su mejor apuesta.

Si necesita "compatibilidad con JavaScript" con el fin de interceptar solicitudes Ajax, entonces debe usar algún tipo de captura también (como YATT) para monitorear cuáles son esas solicitudes y luego emularlas/analizarlas.

Si necesita "soporte de JavaScript" para poder ver cuál es el resultado final de una página con JavaScript estático, entonces mi primera opción sería intentar averiguar qué está haciendo JavaScript en un caso- caso por caso (por ejemplo, si el JavaScript está haciendo algo basado en algún Xml, entonces simplemente analice el Xml directamente)

Si realmente quiere "soporte de JavaScript" (como quiere ver lo que el html es después de los scripts) se han ejecutado en una página), entonces creo que probablemente necesites crear una instancia de algún control del navegador, y luego leer el html/dom resultante desde el control del navegador una vez que termine de cargarlo y analizarlo normalmente con una hermosa sopa. Ese sería mi último recurso sin embargo.

+1

Mientras que BeautifulSoup funciona maravillosamente con el marcado HTML 'estático' que viene 'como está' del servidor, fallará miserablemente con las aplicaciones web ajaxy de una sola página que generan su contenido dinámicamente a través de Javascript y XMLHttpRequests. También fallará en los sitios que dependen de Javascript para mantener el estado de la sesión y la navegación específicamente para evitar el rozamiento web. – ccpizza

4

Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and automated testing.

Aquí van: http://scrapy.org/

3

Selenium ¿quizás? Le permite automatizar un navegador real (Firefox, IE, Safari) usando Python (entre otros idiomas). Está destinado a sitios web de prueba, pero parece que también debería ser utilizable para raspar. (descargo de responsabilidad: nunca lo he usado yo mismo)

1

La biblioteca Webscraping envuelve PyQt4 WebView en una API simple y fácil de usar.

Aquí está un ejemplo sencillo para descargar una página Web representada por WebKit y extraer el elemento del título utilizando XPath (tomado de la URL anterior):

from webscraping import download, xpath 
D = download.Download() 
# download and cache the Google Code webpage 
html = D.get('http://code.google.com/p/webscraping') 
# use xpath to extract the project title 
print xpath.get(html, '//div[@id="pname"]/a/span')