55 votes

Comment récupérer les pages AJAX ?

Veuillez me conseiller sur la façon d'extraire les pages AJAX.

58voto

Brian R. Bondy Points 141769

Vue d'ensemble :

Tout grattage d'écran nécessite d'abord un examen manuel de la page dont vous voulez extraire des ressources. Lorsqu'il s'agit d'AJAX, vous devez généralement analyser un peu plus que le simple HTML.

Lorsqu'il s'agit d'AJAX, cela signifie simplement que la valeur que vous voulez n'est pas dans le document HTML initial que vous avez demandé, mais qu'un javascript sera exécuté pour demander au serveur les informations supplémentaires que vous voulez.

Vous pouvez donc généralement analyser simplement le javascript et voir quelle requête le javascript effectue et appeler cette URL à la place dès le début.


Exemple :

Prenons cet exemple, supposons que la page à partir de laquelle vous voulez scraper a 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>

Il suffit alors d'effectuer à la place une requête HTTP vers time.asp du même serveur. Exemple de w3schools .


Raclage avancé avec C++ :

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

Raclage avancé avec Java :

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

Raclage avancé avec .NET :

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

0 votes

Wow, c'était une information incroyablement utile même avec des outils comme phantomjs maintenant disponibles, savoir comment faire un scrape personnalisé d'une page en utilisant la méthode indiquée est beaucoup plus pratique une fois que vous avez enquêté sur ce qui se passe derrière la scène Merci beaucoup Brian +1

8voto

512banque Points 35

A mon avis, la solution la plus simple est d'utiliser Casperjs un cadre basé sur le navigateur sans tête WebKit, phantomjs.

La page entière est chargée, et il est très facile de récupérer toutes les données liées à l'ajax. Vous pouvez consulter ce tutoriel de base pour apprendre Automatisation et scraping avec PhantomJS et CasperJS

Vous pouvez également jeter un coup d'œil à cet exemple de code, sur la façon d'extraire les mots-clés suggérés par Google :

/*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();
});

0 votes

Mais comment l'utiliser avec PHP ?

0 votes

Vous le lancez avec shell_exec. Pas d'autre choix.

7voto

sblundy Points 27163

Si vous pouvez y accéder, essayez d'examiner l'arbre DOM. Sélénium fait cela dans le cadre du test d'une page. Il dispose également de fonctions permettant de cliquer sur des boutons et de suivre des liens, ce qui peut être utile.

2 votes

Dans un client sélénium script, vous pouvez utiliser la fonction get_html_source() mais elle renvoie la source normale, et non la source générée (post-AJAX). Si vous savez comment accéder à la source générée, dites-le nous.

4voto

sw. Points 1927

La meilleure façon de gratter des pages web utilisant Ajax ou, en général, des pages utilisant Javascript, est d'utiliser le navigateur lui-même ou un navigateur sans tête (un navigateur sans interface graphique). Actuellement, phantomjs est un navigateur sans tête dont la réputation n'est plus à faire et qui utilise WebKit. Une alternative que j'ai utilisée avec succès est HtmlUnit (en Java ou .NET via IKVM qui est un navigateur simulé. Une autre alternative connue consiste à utiliser un outil d'automatisation du Web comme Sélénium .

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

2voto

wonderchook Points 972

Cela dépend de la page ajax. La première partie du screen scraping consiste à déterminer comment la page fonctionne. Y a-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 un grand nombre de tâches liées à l'exploration d'écran, car il est bon marché, facile à démarrer et les non-programmeurs peuvent le faire fonctionner relativement rapidement.

Remarque : les conditions d'utilisation sont probablement un point que vous devriez vérifier avant de faire cela. En fonction du site, le fait d'itérer à travers tout peut soulever quelques drapeaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X