2 Stimmen

Scrape ein Google Chart Script mit Scraperwiki (Python)

Ich steige gerade in das Scraping mit Scraperwiki in Python ein. Habe bereits herausgefunden, wie man Tabellen von einer Seite scrapen, den Scraper jeden Monat ausführen und die Ergebnisse übereinander speichern kann. Ziemlich cool.

Jetzt möchte ich diese Seite mit Informationen zu Android-Versionen scrapen und das Skript monatlich ausführen. Insbesondere möchte ich die Tabelle für die Version, Codename, API und Verteilung. Das ist nicht einfach.

Die Tabelle wird mit einem Wrapper-Div aufgerufen. Gibt es einen Weg, um diese Informationen zu scrapen? Ich kann keine Lösung finden.

Plan B ist, die Visualisierung zu scrapen. Was ich letztendlich brauche, ist der Codename und der Prozentsatz, das reicht aus. Diese Informationen sind im HTML in einem Google Chart-Skript zu finden.

Google Chart API Skript

Aber ich finde diese Informationen nicht in meinem 'soup'-HTML. Ich habe einen öffentlichen Scraper hier. Du kannst ihn bearbeiten, um ihn zum Laufen zu bringen.

Kann mir jemand erklären, wie ich dieses Problem angehen kann? Ein funktionierender Scraper mit Kommentaren, was passiert, wäre großartig.

1voto

Ewan Punkte 13724

Da dies in JavaScript gespeichert und gerendert wird, kann der Roh-Python-Scraper diesen Code nicht ausführen und die Visualisierung oder Tabelle anzeigen.

ScraperWiki ist großartig, jedoch habe ich immer festgestellt, dass, wenn Sie jeden Monat eine einzelne Seite machen, ein Python-Skript + Cron viel besser ist und, wenn Sie dieses JavaScript parsen müssen, die Verwendung von Selenium und dessen python driver eine viel leistungsstärkere Lösung ist.

Wenn der Selenium-Server installiert ist, können Sie ungefähr folgendes tun (in Pseudocode)

#!/bin/env python
from selenium import webdriver

browser = webdriver.Firefox() 
# Lade die Seite mit allem JavaScript in der DOM für dich gerendert.
browser.get("http://developer.android.com/about/dashboards/index.html") 
# Finde die Tabelle
table = browser.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div[2]/div/div/table") 
# Mach etwas mit dem Tabellenelement
# Speichere die Daten
browser.close()

Dann lassen Sie einfach einen Cron-Job das Skript am ersten Tag des Monats ausführen, wie folgt:

0 0 1 * * /path/to/python_script.py

1voto

Suzana Punkte 4131

Dies ist wirklich ein schwieriger Fall, weil, wie kisamoto erwähnt hat, die Daten im eingebetteten JavaScript und nicht in einer separaten JSON-Datei enthalten sind, wie man es erwarten würde. Es ist mit BeautifulSoup möglich, aber es erfordert eine hässliche Zeichenfolgenverarbeitung:

letzter_absatz = soup.find_all('p', style='clear:both')[-1]
script_tag = letzter_absatz.next_sibling.next_sibling
script_text = script_tag.text

zeilen = script_text.split('\n')
data_text = ''
for zeile in zeilen:

    if 'SCREEN_DATA' in zeile: break
    data_text = data_text + zeile

data_text = data_text.replace('var VERSION_DATA =', '')
# Semikolon am Ende löschen
data_text = data_text[:-1]

data = json.loads(data_text)
data = data[0]
print data['data']

Ausgabe:

[{u'perc': u'0.1', u'api': 4, u'name': u'Donut'}, ... ]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X