Web Scraping in einer Google Chrome-Erweiterung (JavaScript + Chrome-APIs)
Lesezeit: 6 Minuten
Seb Nilson
Was sind die besten Optionen für die Durchführung Web Scraping eines derzeit nicht geöffneten Tabs in einer Google Chrome-Erweiterung mit JavaScript und anderen verfügbaren Technologien. Andere JavaScript-Bibliotheken werden ebenfalls akzeptiert.
Wichtig ist, das Scraping so zu maskieren, dass es sich wie eine normale Webanfrage verhält. Keine Hinweise auf AJAX oder XMLHttpRequest, wie X-Requested-With: XMLHttpRequest oder Origin.
Der abgekratzte Inhalt muss für die weitere Bearbeitung und Darstellung innerhalb der Erweiterung über JavaScript zugänglich sein, höchstwahrscheinlich als Zeichenfolge.
Gibt es irgendwelche Hooks in WebKit/Chrome-spezifischen APIs, die verwendet werden können, um eine normale Webanfrage zu stellen und die Ergebnisse für die Manipulation zu erhalten?
var pageContent = getPageContent(url); // TODO: Implement
var items = $(pageContent).find('.item');
// Display items with further selections
Bonuspunkte, damit dies von einer lokalen Datei auf der Festplatte aus funktioniert, zum ersten Debuggen. Aber wenn das der einzige Punkt ist, eine Lösung zu stoppen, dann lassen Sie die Bonuspunkte außer Acht.
@buffer Danke! Das finde ich auch, obwohl 3 Leute dafür gestimmt haben (??!!). Wenn die Antwort “nicht möglich” ist, dann ist das richtig und wird akzeptiert, wenn nach einiger Zeit nichts mehr kommt.
@buffer Es scheint nur Tabs zu öffnen und auf bereits geöffnete Tabs zu hören, nicht wirklich Anfragen im Code. Zumindest nach dem, was ich finden konnte. Danke für den Versuch! 😀
– Seb Nilson
1. Juli 2011 um 11:23 Uhr
@SebNilsson hast du endlich einen Weg gefunden?
– Christoph
6. April 2013 um 15:17 Uhr
@Christophe Nein, keine gute Antwort, die die angegebenen Kriterien erfüllt.
– Seb Nilson
8. April 2013 um 6:10 Uhr
Eli Gray
Versuch zu verwenden XHR2responseType = "document" und zurückfallen (new DOMParser).parseFromString(responseText, getResponseHeader("Content-Type")) mit mein text/html Patch. Sehen https://gist.github.com/1138724 für ein Beispiel, wie ich erkenne responseType = "document Unterstützung (synchron prüfen response === null auf einer Objekt-URL, die aus einem erstellt wurde text/html Klecks).
Könnten Sie Ihre Antwort ein wenig formatieren und vielleicht ein paar Codezeilen für ein Beispiel bereitstellen, bitte.
– Seb Nilson
25. August 2011 um 7:31 Uhr
Herrje, beruhigen Sie sich. Es war nur wie ein 5-Jähriger formatiert, also dachte ich, Sie könnten Ihre “schnellste Waffe im Westen” -Antwort aufräumen.
– Seb Nilson
28. August 2011 um 21:14 Uhr
Und nein, tut mir leid, das geht nicht. Immer noch der gleiche alte “origin null”-Fehler.
– Seb Nilson
1. September 2011 um 8:17 Uhr
Anshul
Wenn Sie sich etwas über ein Google Chrome-Plug-in hinaus ansehen möchten, schauen Sie sich an phantomjs das Qt-Webkit im Hintergrund verwendet und wie ein Browser läuft, einschließlich Ajax-Anfragen. Sie können es einen Headless-Browser nennen, da es die Ausgabe nicht auf einem Bildschirm anzeigt und ganz im Hintergrund arbeiten kann, während Sie andere Dinge erledigen. Wenn Sie möchten, können Sie Bilder und PDF-Dateien aus den abgerufenen Seiten exportieren. Es bietet eine JS-Schnittstelle zum Laden von Seiten, Klicken auf Schaltflächen usw., ähnlich wie in einem Browser. Sie können auch benutzerdefiniertes JS, z. B. jQuery, in jede der Seiten einfügen, die Sie kratzen möchten, und es verwenden, um auf den Dom zuzugreifen und die gewünschten Daten zu exportieren. Als seine Verwendung Webkit sein Wiedergabeverhalten ist genau wie bei Google Chrome.
Eine andere Möglichkeit wäre die Verwendung von Aptana Jaxer das auf der Mozilla Engine basiert und an sich schon ein sehr gutes Konzept ist. Es kann auch als einfaches Schabewerkzeug verwendet werden.
Hat mich eine Weile wirklich dazu gebracht, aber leider scheint keine von ihnen in der Lage zu sein, sich in eine Google Chrome-Erweiterung zu integrieren 🙁 Sie sind beide eigenständige Produkte, die in ihrer eigenen Umgebung gehandhabt werden müssen. Sehr netter Versuch.
– Seb Nilson
25. August 2011 um 19:36 Uhr
@SebNilsson Ich habe vergessen, das früher zu erwähnen, habe die Antwort bearbeitet. Ich bin davon ausgegangen, dass Ihre Notwendigkeit, die Lösung als Chrome-Erweiterung zu haben, ausschließlich auf Ihrer Notwendigkeit basiert, einen echten Browser zu bekommen, der mit der Website interagiert.
– Anshul
26. August 2011 um 9:19 Uhr
Seit diese Frage gestellt wurde, wurden viele Tools veröffentlicht.
artoo.js Ist einer von ihnen. Es ist ein Stück JavaScript-Code, der in der Konsole Ihres Browsers ausgeführt werden soll, um Ihnen einige Scraping-Dienstprogramme bereitzustellen. Es kann auch als Chrome-Erweiterung verwendet werden.
Web Scraping ist in einer Chrome-Erweiterung irgendwie verworren. Ein paar Punkte:
Sie führen Inhaltsskripts für den Zugriff auf das DOM aus.
Hintergrundseiten (eine pro Browser) können senden und empfangen Mitteilungen zu Inhaltsskripten. Das heißt, Sie können ein Inhaltsskript ausführen, das einen RPC-Endpunkt einrichtet und als Antwort einen bestimmten Rückruf im Kontext der Hintergrundseite auslöst.
Sie können Inhaltsskripte in allen Frames einer Webseite ausführen und dann den Dokumentbaum (bestehend aus den 1..N Frames, die die Seite enthält) zusammenfügen.
Wie SK vorgeschlagen hat, kann Ihre Hintergrundseite die Daten als XMLHttpRequest an eine Art leichtgewichtigen HTTP-Server senden, der lokal lauscht.
Steve
Ich bin mir nicht sicher, ob es nur mit JavaScript möglich ist, aber wenn Sie ein dediziertes PHP-Skript für Ihre Erweiterung einrichten können, das cURL verwendet, um den HTML-Code für eine Seite abzurufen, könnte das PHP-Skript die Seite für Sie kratzen und Ihre Erweiterung lesen es durch eine AJAX-Anfrage.
Die tatsächliche Seite, die geschabt wird, würde jedoch nicht wissen, dass es sich um eine AJAX-Anfrage handelt, da auf sie über cURL zugegriffen wird.
Grundsätzlich können Sie also versuchen, die Kombination aus Erweiterung und Plugin zu verwenden. Die Erweiterung hätte Zugriff auf DOM (einschließlich Plugin) und treibe den Prozess. Und das Plugin würde tatsächliche HTTP-Anforderungen senden.
könntest du nicht einfach ein paar iframe tricksen? Wenn Sie die URL in einen dedizierten Frame laden, haben Sie den Dom in einem Dokumentobjekt und können Ihre JQuery-Auswahl treffen, oder?
Ich habe das versucht, aber ich kann nicht auf den Inhalt des Iframe zugreifen, wie in den W3C-Standards angegeben. Hatte gehofft, dass Chrome Extensions mir etwas dazu geben würden.
– Seb Nilson
13. August 2011 um 10:59 Uhr
Sie können auf Iframe-Inhalte zugreifen, indem Sie das Inhaltsskript einschließen. Dies ist die beste Lösung, die ich gefunden habe, und ich verwende sie in vielen meiner Erweiterungen.
– Hamzu
28. September 2011 um 14:14 Uhr
Indem Sie Chrome mit $ chrome –disable-web-security starten, können Sie auf Iframes zugreifen, aber einige Websites mögen dies nicht und brechen Iframes aus
– denysonique
30. Oktober 2012 um 19:26 Uhr
10988800cookie-checkWeb Scraping in einer Google Chrome-Erweiterung (JavaScript + Chrome-APIs)yes
@buffer Danke! Das finde ich auch, obwohl 3 Leute dafür gestimmt haben (??!!). Wenn die Antwort “nicht möglich” ist, dann ist das richtig und wird akzeptiert, wenn nach einiger Zeit nichts mehr kommt.
– Seb Nilson
30. Juni 2011 um 21:16 Uhr
iMacros macht etwas Ähnliches, obwohl ich nicht sicher bin, wie viel Hilfe es bietet. chrome.google.com/webstore/detail/…
– Benutzer
1. Juli 2011 um 4:01 Uhr
@buffer Es scheint nur Tabs zu öffnen und auf bereits geöffnete Tabs zu hören, nicht wirklich Anfragen im Code. Zumindest nach dem, was ich finden konnte. Danke für den Versuch! 😀
– Seb Nilson
1. Juli 2011 um 11:23 Uhr
@SebNilsson hast du endlich einen Weg gefunden?
– Christoph
6. April 2013 um 15:17 Uhr
@Christophe Nein, keine gute Antwort, die die angegebenen Kriterien erfüllt.
– Seb Nilson
8. April 2013 um 6:10 Uhr