web-dev-qa-db-fra.com

Comment grattez-vous les pages AJAX?

Veuillez indiquer comment gratter AJAX pages.

52
xxxxxxx

Présentation:

Tout le grattage d'écran nécessite d'abord un examen manuel de la page dont vous souhaitez extraire les ressources. Lorsque vous traitez avec AJAX vous avez généralement juste besoin d'analyser un peu plus que simplement le HTML.

Lorsque vous traitez avec AJAX cela signifie simplement que la valeur que vous voulez n'est pas dans le document HTML initial que vous avez demandé, mais que javascript sera exécuté qui demandera au serveur les informations supplémentaires que vous voulez.

Vous pouvez donc généralement simplement analyser le javascript et voir quelle demande le javascript fait et appeler simplement cette URL à la place depuis le début.


Exemple:

Prenons cela comme exemple, supposons que la page à partir de laquelle vous souhaitez extraire possède le script suivant:

<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.myForm.time.value=xmlHttp.responseText;
      }
    }
  xmlHttp.open("GET","time.asp",true);
  xmlHttp.send(null);
  }
</script>

Ensuite, tout ce que vous devez faire est à la place de faire une requête HTTP à time.asp du même serveur. Exemple de w3schools .


Grattage avancé avec C++:

Pour une utilisation complexe, et si vous utilisez C++, vous pouvez également envisager d'utiliser le moteur javascript firefox SpiderMonkey pour exécuter le javascript sur une page.

Grattage avancé avec Java:

Pour une utilisation complexe, et si vous utilisez Java vous pouvez également envisager d'utiliser le moteur javascript firefox pour Java Rhino

Grattage avancé avec .NET:

Pour une utilisation complexe, et si vous utilisez .Net, vous pouvez également envisager d'utiliser l'assembly Microsoft.vsa. Récemment remplacé par ICodeCompiler/CodeDOM.

53
Brian R. Bondy

À mon avis, la solution la plus simple consiste à utiliser Casperjs , un cadre basé sur les phantomjs du navigateur sans tête WebKit.

La page entière est chargée et il est très facile de gratter toutes les données liées à ajax. Vous pouvez consulter ce tutoriel de base pour apprendre Automatisation et grattage avec PhantomJS et CasperJS

Vous pouvez également jeter un œil à cet exemple de code, sur la façon de gratter Google suggère des mots clés:

/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var Word = casper.cli.get(0);

if (!Word) {
    casper.echo('please provide a Word').exit(1);
}

casper.start('http://www.google.com/', function() {
    this.sendKeys('input[name=q]', Word);
});

casper.waitFor(function() {
  return this.fetchText('.gsq_a table span').indexOf(Word) === 0
}, function() {
  suggestions = this.evaluate(function() {
      var nodes = document.querySelectorAll('.gsq_a table span');
      return [].map.call(nodes, function(node){
          return node.textContent;
      });
  });
});

casper.run(function() {
  this.echo(suggestions.join('\n')).exit();
});
8
mattspain

Si vous pouvez y accéder, essayez d'examiner l'arborescence DOM. Selenium fait cela dans le cadre du test d'une page. Il a également des fonctions pour cliquer sur les boutons et suivre les liens, ce qui peut être utile.

7
sblundy

La meilleure façon de gratter des pages Web en utilisant Ajax ou en général des pages en utilisant Javascript est avec un navigateur lui-même ou un navigateur sans tête (un navigateur sans interface graphique). Actuellement phantomjs est un navigateur sans tête bien promu utilisant WebKit. Une alternative que j'ai utilisée avec succès est HtmlUnit (dans Java ou .NET via IKVM , qui est un navigateur simulé. Une autre alternative connue consiste à utiliser un outil d'automatisation Web comme Selenium .

J'ai écrit de nombreux articles sur ce sujet comme sites Web Ajax et Javascript et sans navigateur automatisé OAuth pour Twitter . À la fin de la premier article il y a beaucoup de ressources supplémentaires que je compile depuis 2011.

4
sw.

J'aime PhearJS , mais c'est peut-être en partie parce que je l'ai construit.

Cela dit, c'est un service que vous exécutez en arrière-plan qui parle HTTP (S) et rend les pages en JSON pour vous, y compris toutes les métadonnées dont vous pourriez avoir besoin.

2
TTT

Dépend de la page ajax. La première partie du grattage d'écran consiste à déterminer le fonctionnement de la page. Existe-t-il une sorte de variable que vous pouvez parcourir pour demander toutes les données de la page? Personnellement, j'ai utilisé Web Scraper Plus pour de nombreuses tâches liées au raclage d'écran car il est bon marché, pas difficile à démarrer, les non-programmeurs peuvent le faire fonctionner assez rapidement.

Remarque: les conditions d'utilisation sont probablement quelque part que vous voudrez peut-être vérifier avant de le faire. Selon le site, itérer à travers tout peut déclencher quelques drapeaux.

2
wonderchook

En tant que solution à faible coût, vous pouvez également essayer SWExplorerAutomation (SWEA). Le programme crée une API d'automatisation pour toute application Web développée avec HTML, DHTML ou AJAX.

1
Alex

Je pense que la réponse de Brian R. Bondy est utile lorsque le code source est facile à lire. Je préfère un moyen simple d'utiliser des outils comme Wireshark ou HttpAnalyzer pour capturer le paquet et obtenir l'url du champ "Host" et du champ "GET".

Par exemple, je capture un paquet comme celui-ci:

GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
 HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive

L'URL est alors:

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330
1
yxc

Selenium WebDriver est une bonne solution: vous programmez un navigateur et vous automatisez ce qui doit être fait dans le navigateur. Les navigateurs (Chrome, Firefox, etc.) fournissent leurs propres pilotes qui fonctionnent avec Selenium. Puisqu'il fonctionne comme un automatisé VRAI navigateur, les pages (y compris javascript et Ajax) sont chargées comme elles le font avec un humain utilisant ce navigateur.

L'inconvénient est qu'il est lent (car vous aimeriez très probablement attendre que toutes les images et tous les scripts se chargent avant de faire votre scraping sur cette seule page).

1
hekimgil

J'ai déjà lié au solvant du MIT et à EnvJS comme réponses pour gratter les pages Ajax. Ces projets ne semblent plus accessibles.

Par pure nécessité, j'ai inventé une autre façon de supprimer les pages Ajax, et cela a fonctionné pour des sites difficiles comme findthecompany qui ont des méthodes pour trouver des moteurs javascript sans tête et ne montrer aucune donnée.

La technique consiste à utiliser les extensions chrome pour effectuer le scraping. Chrome sont le meilleur endroit pour supprimer les pages Ajax car elles nous permettent en fait d'accéder à un DOM modifié par javascript). . La technique est la suivante, je vais certainement ouvrir le code source dans le temps. Créez une extension chrome (en supposant que vous savez comment en créer une, ainsi que son architecture et ses capacités. Ceci est facile à apprendre et pratique car il y a beaucoup d'échantillons),

  1. Utilisez des scripts de contenu pour accéder au DOM, en utilisant xpath. Obtenez à peu près la liste ou la table entière ou le contenu rendu dynamiquement en utilisant xpath dans une variable en tant que chaîne HTML Nodes. (Seuls les scripts de contenu peuvent accéder à DOM mais ils ne peuvent pas contacter une URL à l'aide de XMLHTTP)
  2. Du script de contenu, en utilisant la transmission de messages, envoyez un message à l'ensemble du DOM supprimé en tant que chaîne, à un script d'arrière-plan. (Les scripts d'arrière-plan peuvent parler aux URL mais ne peuvent pas toucher le DOM). Nous utilisons la transmission de messages pour les faire parler.
  3. Vous pouvez utiliser divers événements pour parcourir les pages Web et passer chaque contenu HTML supprimé Node contenu au script d'arrière-plan.
  4. Utilisez maintenant le script d'arrière-plan pour parler à un serveur externe (sur localhost), simple créé à l'aide de Nodejs/python. Il suffit d'envoyer l'intégralité des nœuds HTML sous forme de chaîne au serveur, où le serveur persistera simplement le contenu qui y est publié, dans des fichiers, avec les variables appropriées pour identifier les numéros de page ou les URL.
  5. Vous avez maintenant gratté AJAX contenu (nœuds HTML sous forme de chaîne), mais ce sont des nœuds html partiels. Vous pouvez maintenant utiliser votre bibliothèque XPATH préférée pour les charger en mémoire et utiliser XPATH pour gratter les informations dans les tableaux ou texte.

Veuillez commenter si vous ne comprenez pas et je peux mieux l'écrire. ( premier essai ). En outre, j'essaie de publier un exemple de code dès que possible.

0
Deepan Prabhu Babu