web-dev-qa-db-fra.com

Web Scraping dans une extension Google Chrome (JavaScript + Chrome)

Quelles sont les meilleures options pour effectuer Web Scraping d'un onglet non ouvert depuis Google Chrome Extension avec JavaScript et toutes les autres technologies disponibles. D'autres bibliothèques JavaScript sont également acceptées.

L'important est de masquer le grattage pour se comporter comme une requête web normale. Aucune indication de AJAX ou XMLHttpRequest, comme X-Requested-With: XMLHttpRequest ou Origin.

Le contenu récupéré doit être accessible à partir de JavaScript pour une manipulation et une présentation supplémentaires au sein de l'extension, très probablement sous forme de chaîne.

Existe-t-il des points d'ancrage dans les API spécifiques à WebKit/Chrome qui peuvent être utilisés pour effectuer une demande Web normale et obtenir les résultats pour une manipulation?

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

Points bonus pour que cela fonctionne à partir d'un fichier local sur le disque , pour le débogage initial. Mais si c'est le seul point qui arrête une solution, alors ignorez les points bonus.

68
Seb Nilsson

Essayez d'utiliser XHR2responseType = "document" et se replier sur (new DOMParser).parseFromString(responseText, getResponseHeader("Content-Type")) avec mon text/html patch . Voir https://Gist.github.com/1138724 pour un exemple de la façon dont je détecte responseType = "document support (vérification synchrone response === null sur une URL d'objet créée à partir d'un text/html blob).

Utilisez l'API Chrome WebRequest pour masquer X-Requested-With, etc. en-têtes.

12
Eli Grey

Si vous regardez bien quelque chose au-delà d'un Google Chrome Plugin, regardez phantomjs qui utilise Qt-Webkit en arrière-plan et fonctionne comme un navigateur comprenant des requêtes ajax. Vous pouvez l'appeler un navigateur sans tête, car il n'affiche pas la sortie sur un écran et peut fonctionner en arrière-plan pendant que vous faites d'autres choses. Si vous le souhaitez, vous pouvez exporter des images, des PDF hors des pages qu'il récupère. fournit une interface JS pour charger les pages, en cliquant sur les boutons, etc., tout comme vous l'avez dans un navigateur. Vous pouvez également injecter du JS personnalisé, par exemple jQuery, sur l'une des pages que vous souhaitez gratter et l'utiliser pour accéder au dom et exporter les données souhaitées. Comme son utilisation Webkit son comportement de rendu est exactement comme Google Chrome.

Une autre option serait d'utiliser Aptana Jaxer qui est basé sur Mozilla Engine et est un très bon concept en soi. Il peut également être utilisé comme un simple outil de grattage.

10
Anshul

De nombreux outils ont été publiés depuis que cette question a été posée.

artoo.js est l'un d'entre eux. C'est un morceau de code JavaScript destiné à être exécuté dans la console de votre navigateur pour vous fournir quelques utilitaires de grattage. Il peut également être utilisé comme une extension chrome.

7
potar

Le scraping Web est un peu compliqué dans une extension Chrome. Quelques points:

  • Vous exécutez des scripts de contenu pour accéder au DOM.
  • Les pages d'arrière-plan (une par navigateur) peuvent envoyer et recevoir messages aux scripts de contenu. Autrement dit, vous pouvez exécuter un script de contenu qui configure un point de terminaison RPC et déclenche un rappel spécifié dans le contexte de la page d'arrière-plan en tant que réponse.
  • Vous pouvez exécuter des scripts de contenu dans tous les cadres d'une page Web, puis assembler l'arborescence du document (composée des cadres 1..N que contient la page).
  • Comme S.K. suggéré, votre page d'arrière-plan peut envoyer les données en tant que XMLHttpRequest à une sorte de serveur HTTP léger qui écoute localement.
6
Novikov

Je ne suis pas sûr que ce soit tout à fait possible avec seulement JavaScript, mais si vous pouvez configurer un script PHP pour votre extension qui utilise cURL pour récupérer le code HTML d'une page, le PHP pourrait gratter la page pour vous et votre extension pourrait la lire via une requête AJAX.

La page réelle en cours de scrap ne sait pas qu'il s'agit d'une demande AJAX, cependant, car elle est accessible via cURL.

5
Steve

Je pense que vous pouvez partir de cela exemple .

Donc, fondamentalement, vous pouvez essayer d'utiliser la combinaison Extension + Plugin. L'extension aurait accès au DOM (y compris le plugin) et piloterait le processus. Et le plugin enverrait des requêtes HTTP réelles.

Je peux recommander d'utiliser Firebreath comme une plate-forme de plug-in multiplateforme Chrome/Firefox, en particulier jetez un œil à cet exemple: Firebreath - Création + HTTP + Requêtes + avec + SimpleStreamsHelper

4
Dmitry Chichkov

ne pourriez-vous pas simplement faire une supercherie iframe? si vous chargez l'url dans un cadre dédié, vous avez le dom dans un objet document et pouvez faire vos sélections jquery, non?

3
tim