2009-03-21 6 views
0

J'essaie d'écran gratter une page Web (en utilisant Mechanize) qui affiche les enregistrements dans une grille page sage. Je suis capable de lire les valeurs affichées dans la première page, mais je dois maintenant aller à la page suivante pour lire les valeurs appropriées.Scrape page Web qui affiche des pages de données sages en utilisant Mechanize

<tr> 
    <td><span>1</span></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$2')">2</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$3')" >3</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$4')" >4</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$5')" >5</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$6')">6</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$7')" >7</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$8')">8</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$9')" >9</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$10')" >10</a></td> 
    <td><a href="javascript:__doPostBack('gvw_offices','Page$11')">...</a></td> 
</tr> 

Je suis en mesure de passer à travers tous les liens, mais quand j'essaie ceci: -

links = (row/"a") 
links.each do |link| 
    agent.click link.attributes['href'] # This fails 
    agent.click link # This also fails 
end 

La raison est que agent.click attend l'URL comme argument.

Existe-t-il un moyen de lire toutes les valeurs lorsqu'elles sont affichées sur la page? Sinon, comment pouvons-nous avoir une telle action de clic lorsque le href est une publication et non une URL ??

Répondre

5

Mechanize ne peut pas gérer le javascript, donc en gros vous avez deux options:

  • utilisation scrubyt et firewatir: il est un moyen de scripts votre navigateur (si Firefox gère la partie javascript)
  • vérifier manuellement l'URL de base et ajouter dynamiquement le numéro de page

quelque chose comme:

base_url = 'http://example.com/gvw_offcies&page=' 
links.each do |link| 
    page_number = ... #get the page number from link 
    agent.get base_url+page_number 
end 
+0

C'est une bonne solution! – Geo

+0

Problème est que cette page utilise ASP.Grid pour afficher les enregistrements de la page sage, par conséquent le lien pour chaque page non est un retour de publication et n'a pas une URL directe. Voulez-vous dire que si nous ajoutons un nom de grille et un numéro de page dans l'URL, nous pouvons provoquer cette publication (bien que cela n'ait pas fonctionné quand je l'ai essayé)? – MOZILLA

+0

Je ne suis pas familier avec ASP.net mais un post retour est essentiellement une requête POST à ​​la page actuelle, n'est ce pas? donc vous pouvez essayer quelque chose comme agent.post current_url, {"page_number" => page_number} –

0

J'utiliserais quelque chose comme webscarab pour voir simplement où le POST demande que le Javascript fonctionne réellement. Surtout pour les trucs AJAX, ce ne sont que des requêtes HTTP de toute façon.
Il suffit de le démarrer et le définir comme un proxy dans Firefox. La plupart du temps vous pouvez voir une sorte de modèle et juste gratter ces URL directement

0

Vous pourriez essayer d'utiliser Celerity dans Jruby et passer la page à une bibliothèque d'analyse HTML. Celerity est supposé être compatible API avec Watir et est un wrapper autour de HtmlUnit. J'utilisais mécaniser pour la collecte de données, mais j'ai dû passer à cela pour quelques-uns des sites qui ont été générés dans JS.

http://celerity.rubyforge.org/

1

toutes les solutions ci-dessus, je l'ai essayé dans le passé pour un bon bout de temps (en particulier Célérité), mais ma conclusion à laquelle ils isthat sont tous horribles et ont allées graves court qui rend la vie très difficile depuis ils sont basés sur le même moteur HtmlUnit pour gérer Javascript. Celerity n'est pas un outil de capture d'écran, il manque de gestion de Windows, et est basé sur le moteur HTMLUNIT qui n'est pas du tout bon pour manipuler Javascript. Cependant, cela fonctionne rapidement pour les sites utilisant des requêtes Javascript et AJAX de niveau minimal à moyen. Il est basé sur le rubis qui sera un soulagement pour ceux qui n'aiment pas Java.

Votre meilleur pari est d'utiliser l'API Selenium WebDriver. Cela nécessite X affichage sur votre serveur Linux et c'est plus lent que HtmlUnit, mais il ne vous harcèlera pas avec beaucoup de problèmes que vous aurez à utiliser tout dérivé ou envelopper HtmlUnit. Il y a une option pour utiliser HtmlUnit mais vous sacrifiez la précision, la cohérence pour la vitesse. HtmlUnit est beaucoup plus rapide pour gratter. Cependant, la vitesse n'est pas toujours une bonne chose lorsque vous voulez gratter d'autres sites que vous ne possédez pas, car cela justifie généralement une interdiction d'IP.

Mon conseil personnel est de rester à l'écart de tout ce qui utilise le moteur HtmlUnit, et d'utiliser Selenium qui contrôle directement le navigateur de votre choix pour une précision et une fiabilité maximales.

Questions connexes