2010-02-03 34 views
15

Czy Python ma skrobaczki ekranowe, które oferują obsługę JavaScript?Skrobanie ekranu za pomocą Pythona

Używam pycurl do prostych wniosków HTML i Java HtmlUnit dla bardziej skomplikowanych wniosków wymagających wsparcia JavaScript.

Idealnie chciałbym móc zrobić wszystko od Pythona, ale nie natknąłem się na żadne biblioteki, które pozwoliłyby mi to zrobić. Czy one istnieją?

+4

Wiele pomocnych odpowiedzi na podobne pytania tutaj: http://stackoverflow.com/search?q=scraping+python – 3zzy

+1

Dokładny duplikat: http://stackoverflow.com/questions/2081586/web-scraping-with-python –

+0

no not a exact duplicate. Ten wspomina o JavaScript, który wymaga innych narzędzi niż podczas pracy ze statycznym HTML. – hoju

Odpowiedz

12

Istnieje wiele opcji, gdy mamy do czynienia ze statycznym HTML, których inne reakcje pokrycia. Jeśli jednak potrzebujesz wsparcia JavaScript i chcesz pozostać w Pythonie, polecam użyć strony webkit, aby wyświetlić stronę internetową (w tym JavaScript), a następnie przeanalizować wynikowy kod HTML. Na przykład:

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 - próbuję użyć tego kodu do zeskanowania strony internetowej, ale nie jestem pewien, co zrobić ze zmienną "javascript_html" po jej zwróceniu. 'print javsascript_html' zwraca błąd' UnicodeEncodeError: 'kodek ascii' nie może kodować znaku u '\ u2026' w pozycji 4200: porządkowy nie w zakresie (128) '. proszę pomóż! :) – significance

+0

to jest błąd Unicode – hoju

+0

Próbuję tego z Pythonem 3, ale renderowany HTML nie ma przetworzonego Javascript. Oto kod: [link] (http://pastebin.com/vzX9p7jv) – karmapolice

-2

Nie znalazłem nic dla tego. Używam kombinacji beautifulsoup i niestandardowych procedur ...

0

możesz spróbować 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 nie skanuje skrobanie. – bdd

11

Beautiful soup to prawdopodobnie Twój najlepszy zakład.

Jeśli potrzebujesz "obsługi JavaScript" w celu przechwytywania żądań Ajax, powinieneś również użyć przechwytywania (np. YATT), aby monitorować, jakie są te żądania, a następnie emulować/analizować je.

Jeśli potrzebujesz "obsługi JavaScript", aby móc zobaczyć, jaki jest wynik końcowy strony ze statycznym JavaScript, to moim pierwszym wyborem byłaby próba ustalenia, co JavaScript robi w sprawie: w zależności od przypadku (np. jeśli JavaScript robi coś w oparciu o jakiś Xml, po prostu parsuj bezpośrednio Xml)

Jeśli naprawdę chcesz "obsługi JavaScript" (jak chcesz zobaczyć, co jest po skryptach, html zostały uruchomione na stronie), wtedy prawdopodobnie będziesz musiał utworzyć instancję jakiejś kontroli przeglądarki, a następnie odczytać wynikowy html/dom z kontrolki przeglądarki po zakończeniu ładowania i parsować normalnie piękną zupę. To byłaby jednak moja ostatnia deska ratunku.

+1

Podczas gdy BeautifulSoup działa pięknie z "statycznym" znacznikiem HTML, który pochodzi z serwera tak jak jest "as-is", nie uda mu się to z pomocą aplikacji internetowych ajaxy o pojedynczej stronie, które dynamicznie generują zawartość za pośrednictwem Javascript i XMLHttpRequests. Nie powiedzie się również na stronach, które polegają na JavaScript, aby utrzymać stan sesji i nawigację specjalnie w celu zapobiegania skrobania w Internecie. – 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.

Proszę bardzo: http://scrapy.org/

3

Selenium może? Pozwala zautomatyzować rzeczywistą przeglądarkę (Firefox, IE, Safari) za pomocą Pythona (w innych językach). Jest przeznaczony do testowania stron internetowych, ale wydaje się, że powinien być również przydatny do skrobania. (disclaimer: nigdy nie użyłem go sam)

1

Biblioteka Py2t4 WebView jest prosta i łatwa w użyciu.

Oto prosty przykład, aby pobrać stronę internetową świadczonych przez WebKit i wyodrębnić element tytuł za pomocą XPath (zaczerpnięte z adresu URL powyżej):

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') 
Powiązane problemy