Web Scraping in einer Google Chrome-Erweiterung (JavaScript + Chrome-APIs)

72

Was sind die besten Optionen für das Web-Scraping eines derzeit nicht geöffneten Tabs in einer Google Chrome-Erweiterung mit JavaScript und den verfügbaren Technologien ? Andere JavaScript-Bibliotheken werden ebenfalls akzeptiert.

Das Wichtigste ist, das Scraping so zu maskieren, dass es sich wie eine normale Webanforderung verhält . Keine Hinweise auf AJAX oder XMLHttpRequest, wie X-Requested-With: XMLHttpRequestoder Origin.

Der abgekratzte Inhalt muss über JavaScript zugänglich sein, damit er innerhalb der Erweiterung weiter bearbeitet und dargestellt werden kann, höchstwahrscheinlich als Zeichenfolge.

Gibt es Hooks in einer WebKit / Chrome-spezifischen API: s, mit denen eine normale Webanforderung gestellt und die Ergebnisse für die Manipulation abgerufen werden können?

var pageContent = getPageContent(url); // TODO: Implement
var items = $(pageContent).find('.item');
// Display items with further selections

Bonuspunkte, damit dies aus einer lokalen Datei auf der Festplatte für das erste Debugging funktioniert . Aber wenn dies der einzige Punkt ist, der eine Lösung stoppt, ignorieren Sie die Bonuspunkte.

Seb Nilsson
quelle
@ Puffer Danke! Ich denke auch, obwohl 3 Leute für das Schließen gestimmt haben (?? !!). Wenn die Antwort "nicht möglich" ist, dann ist das richtig und wird akzeptiert, wenn in einer Weile nichts anderes kommt.
Seb Nilsson
iMacros macht etwas Ähnliches, obwohl ich nicht sicher bin, wie viel Hilfe es bietet. chrome.google.com/webstore/detail/…
Benutzer
@buffer Es scheint nur Tabs zu öffnen und bereits geöffnete Tabs anzuhören, nicht wirklich Anfragen im Code. Zumindest von dem, was ich finden konnte. Danke für den Versuch! : D
Seb Nilsson
@SebNilsson hast du endlich einen Weg gefunden?
Christophe
@Christophe Nopes, keine gute Antwort, die die angegebenen Kriterien erfüllt.
Seb Nilsson

Antworten:

12

Versuchen Sie , verwenden XHR2 responseType = "document" und fallen zurück auf (new DOMParser).parseFromString(responseText, getResponseHeader("Content-Type"))mit meinem text/htmlPatch . Unter https://gist.github.com/1138724 finden Sie ein Beispiel dafür, wie ich responseType = "documentUnterstützung erkenne (synchrones Überprüfen response === nulleiner aus einem text/htmlBlob erstellten Objekt-URL ).

Verwenden Sie die Chrome WebRequest-API , um X-Requested-WithHeader usw. auszublenden .

Eli Gray
quelle
Könnten Sie Ihre Antwort ein wenig formatieren und vielleicht ein paar Codezeilen als Beispiel angeben?
Seb Nilsson
13
Herrgott, beruhige dich. Es wurde nur wie ein 5-Jähriger formatiert, also dachte ich, Sie könnten Ihre "schnellste Waffe im Westen" -Antwort aufräumen.
Seb Nilsson
1
Und nein, tut mir leid, es funktioniert nicht. Immer noch den gleichen alten "origin null" -Fehler.
Seb Nilsson
10

Wenn Sie sich etwas anderes als ein Google Chrome-Plugin ansehen möchten , schauen Sie sich Phantomjs an , das Qt-Webkit im Hintergrund verwendet und wie ein Browser ausgeführt wird, der Ajax-Anfragen stellt. Sie können es als kopflosen Browser bezeichnen, da es die Ausgabe nicht auf einem Bildschirm anzeigt und ruhig im Hintergrund arbeiten kann, während Sie andere Dinge tun. Wenn Sie möchten, können Sie Bilder und PDF-Dateien aus den abgerufenen Seiten exportieren. Es bietet eine JS-Oberfläche 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 damit auf den Dom zugreifen und die gewünschten Daten exportieren. Bei der Verwendung von Webkit entspricht das Renderverhalten genau dem von Google Chrome.

Eine andere Möglichkeit wäre die Verwendung von Aptana Jaxer, das auf Mozilla Engine basiert und an sich ein sehr gutes Konzept darstellt. Es kann auch als einfaches Schabewerkzeug verwendet werden.

Anshul
quelle
Ich habe mich wirklich für eine Weile dorthin begeben, aber keiner von ihnen scheint sich leider in eine Google Chrome-Erweiterung integrieren zu lassen :( Beide sind eigenständige Produkte, die in einer eigenen Umgebung gehandhabt werden müssen. Sehr guter Versuch.
Seb Nilsson
@SebNilsson Ich habe vergessen zu erwähnen, dass ich die Antwort bearbeitet habe. Ich ging davon aus, dass Sie die Lösung benötigen, da die Chrome-Erweiterung ausschließlich auf Ihrer Notwendigkeit basiert, einen echten Browser für die Interaktion mit der Site zu benötigen.
Anshul
8

Seit diese Frage gestellt wurde, wurden viele Tools veröffentlicht.

artoo.js ist einer von ihnen. Es handelt sich um einen Teil des JavaScript-Codes, der in der Konsole Ihres Browsers ausgeführt werden soll, um Ihnen einige Scraping-Dienstprogramme bereitzustellen. Es kann auch als Chromverlängerung verwendet werden.

Potar
quelle
6

Web Scraping ist in einer Chrome-Erweiterung ziemlich kompliziert. Ein paar Punkte:

  • Sie führen Inhaltsskripte für den Zugriff auf das DOM aus.
  • Hintergrundseiten (eine pro Browser) können Nachrichten an Inhaltsskripte senden und empfangen . Das heißt, Sie können ein Inhaltsskript ausführen, das einen RPC-Endpunkt einrichtet und als Antwort einen angegebenen 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 von SK vorgeschlagen, kann Ihre Hintergrundseite die Daten als XMLHttpRequest an einen kompakten HTTP-Server senden, der lokal zuhört.
Novikov
quelle
1
Dies dient zum Scraping von Seiten, die derzeit in einem Chrome-Tab geöffnet sind. Richtig?
MGOwen
5

Ich bin mir nicht sicher, ob dies nur mit JavaScript möglich ist. Wenn Sie jedoch ein dediziertes PHP-Skript für Ihre Erweiterung einrichten können, das cURL zum Abrufen des HTML-Codes für eine Seite verwendet, kann das PHP-Skript die Seite für Sie kratzen und Ihre Erweiterung lesen es in durch eine AJAX-Anfrage.

Die tatsächlich gekratzte Seite würde jedoch nicht wissen, dass es sich um eine AJAX-Anforderung handelt, da auf sie über cURL zugegriffen wird.

Steve
quelle
4

Ich denke, Sie können von diesem Beispiel ausgehen .

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 würde den Prozess steuern. Und das Plugin würde tatsächliche HTTP-Anfragen senden.

Ich kann die Verwendung von Firebreath als plattformübergreifende Chrome / Firefox-Plugin-Plattform empfehlen. Sehen Sie sich insbesondere dieses Beispiel an: Firebreath - Erstellen von + HTTP + -Anfragen + mit + SimpleStreamsHelper

Dmitry Chichkov
quelle
3

Könntest du nicht einfach ein paar Iframe-Tricks machen? Wenn Sie die URL in einen dedizierten Frame laden, haben Sie den Dom in einem Dokumentobjekt und können Ihre JQuery-Auswahl treffen, nicht wahr?

tim
quelle
Ich habe das versucht, kann aber nicht auf den Inhalt des Iframes zugreifen, wie in den W3C-Standards angegeben. Ich hatte gehofft, Chrome Extensions würde mir etwas dagegen geben.
Seb Nilsson
Sie können auf iframe-Inhalte zugreifen, indem Sie ein Inhaltsskript einfügen. Dies ist die beste Lösung, die ich gefunden habe, und ich verwende sie in vielen meiner Erweiterungen.
Hamczu
Durch Starten von Chrome mit $ chrome --disable-web-security können Sie auf iframes zugreifen, aber einige Websites mögen dies nicht und brechen von iframes aus
denysonique