Obtenir des données d'une page Web de manière stable et efficace

11

Récemment, j'ai appris que l'utilisation d'une expression régulière pour analyser le code HTML d'un site Web afin d'obtenir les données dont vous avez besoin n'est pas la meilleure solution.

Ma question est donc simple: quel est donc le moyen le meilleur / le plus efficace et généralement stable pour obtenir ces données?

Je dois noter que:

  • Il n'y a pas d'API
  • Il n'y a aucune autre source d'où je peux obtenir les données (pas de bases de données, de flux et autres)
  • Il n'y a pas d'accès aux fichiers source. (Données de sites Web publics)
  • Disons que les données sont du texte normal, affiché dans un tableau dans une page html

J'utilise actuellement python pour mon projet mais une solution / astuces indépendantes du langage serait bien.

Comme une question secondaire: comment vous y prendriez-vous lorsque la page Web est construite par des appels Ajax?

ÉDITER:

Dans le cas de l'analyse HTML, je sais qu'il n'y a aucun moyen stable réel d'obtenir les données. Dès que la page change, votre analyseur est terminé. Ce que je veux dire avec stable dans ce cas est: un moyen efficace d'analyser la page, qui me donne toujours les mêmes résultats (pour le même ensemble de données évidemment) à condition que la page ne change pas .

Mike
la source
8
Il n'existe aucun moyen stable, quelle que soit la façon dont vous implémentez votre grattage, il peut facilement se rompre avec un simple changement de page Web. La manière stable d'obtenir vos données est de contacter les auteurs des données et de négocier un accord pour que vous obteniez les données dans un format sain. Parfois, cela ne coûte même pas de l'argent.
Joachim Sauer
1
@JoachimSauer - La question pourrait toujours être répondue avec la «meilleure» méthode.
Anonyme
Étant donné que la plupart des sites Web sont dynamiques et stockent leurs données dans des bases de données, le meilleur moyen est d'obtenir la base de données à partir du site Web. Si le site Web dispose d'une API, vous pouvez l'utiliser. Si vous souhaitez gratter les pages statiques, les modules Python urllib et HTMLParser intégrés fonctionnent bien. Quelques packages de scraping HTML sont également disponibles sur PyPi.
Ubermensch
Le raclage du site est une affaire délicate. Il n'y a vraiment aucun moyen stable de le faire parce que les propriétaires de sites ne le veulent pas, et l'industrie dans son ensemble essaie d'empêcher les gens de le faire.
Steven Evers
1
Peut-être intégrer un navigateur Web tel que Webkit, puis utiliser les scripts DOM pour obtenir des informations à partir de la page rendue? Presque toutes les plateformes peuvent le faire, mais voici comment vous le feriez dans Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Réponses:

2

Eh bien, voici mes 2 cents:

S'il n'y a pas d'AJAX impliqué, ou si cela peut être effacé facilement, 'corrigez' le HTML en XHTML (en utilisant HTMLTidy par exemple), puis utilisez XPath au lieu d'expressions régulières pour extraire les informations.
Dans une page Web bien structurée, les entités d'informations logiquement séparées sont dans des <div>s différents , ou dans n'importe quelle autre balise, ce qui signifie que vous seriez en mesure de trouver facilement les bonnes informations avec une simple expression XPath. C'est très bien aussi parce que vous pouvez le tester dans, disons, la console de Chrome ou la console de développement de Firefox et vérifier qu'il fonctionne avant d'écrire même une ligne d'un autre code.
Cette approche a également un rapport signal / bruit très élevé, car généralement les expressions pour sélectionner les informations pertinentes seront à une ligne. Ils sont également beaucoup plus faciles à lire que les expressions régulières et sont conçus à cet effet.

Si AJAX et du JavaScript sérieux sont impliqués dans la page, intégrez un composant de navigateur dans l'application et utilisez son DOM pour déclencher les événements dont vous avez besoin et XPath pour extraire des informations. Il existe de nombreux bons composants de navigateur intégrables, dont la plupart utilisent des navigateurs du monde réel sous le capot, ce qui est une bonne chose, car une page Web peut être incorrecte (X) HTML, mais reste bonne sur tous les principaux navigateurs ( en fait, la plupart des pages finissent par arriver de cette façon).

K.Steff
la source
Merci, je vais certainement jeter un œil à XPath. Je n'ai pas l'habitude de travailler avec, donc ce sera une bonne chose à apprendre. +1 :)
Mike
5

D'après mon expérience, en utilisant l'environnement .NET, vous pouvez profiter de HTML Agility Pack .

Si la page est au format XHTML, vous pouvez également utiliser un analyseur XML standard. Il y en a beaucoup pour n'importe quel environnement que vous pouvez imaginer.

Pour la question secondaire sur AJAX, vous pouvez utiliser le code réseau HTTP standard pour obtenir des données et les analyser.

Encore une fois, si votre pile AJAX renvoie XML, vous aurez beaucoup de choix. S'il renvoie JSON, envisagez une bibliothèque qui vous permet de mapper le flux à des objets typés. Dans .NET, je vous suggère Newtonsoft.Json .

gsscoder
la source
Et par «code de mise en réseau HTTP», vous entendez capturer la réponse du serveur lorsqu'une demande est faite? Merci pour les suggestions, je serai sûr de les consulter. +1
Mike
Exactement. Dans .NET, vous pouvez utiliser System.Net.WebClient ou une bibliothèque comme RestSharp | restsharp.org . Je l'ai également utilisé sur Mono for Droid.
gsscoder
4

L'analyse HTML n'est pas une tâche complètement triviale, car il faut faire face à un balisage éventuellement incorrect (soupe de balises). Au fil des ans, les navigateurs ont mis en œuvre plus ou moins la même stratégie pour traiter les erreurs, et cet algorithme a été baptisé dans la spécification HTML5 (oui, la spécification HTML5 spécifie quoi faire avec des choses qui ne sont pas HTML5).

Il existe des bibliothèques pour toutes les langues principales pour analyser HTML, par exemple celui-ci .

Dans tous les cas, ce que vous obtiendrez n'est en aucun cas stable. Chaque fois que le format de la page Web change, vous devez adapter votre grattoir.

Andrea
la source
Merci, j'utilise Beautiful Soup pour faire le travail. Je sais que ce ne sera pas stable, je devrais probablement le clarifier dans mes questions. +1 pour vous :)
Mike
4

Comme une question secondaire: comment vous y prendriez-vous lorsque la page Web est construite par des appels Ajax?

Si des appels ajax sont effectués, il est très probable que ce soit une URL POST ou GET avec des variables.

J'examinerais le JavaScript pour découvrir quels sont les points de terminaison et les paramètres. Après cela, il est très probable que les données renvoyées soient du json / xml / du texte brut ou peut-être du html partiel.

Une fois que vous connaissez les informations ci-dessus, il vous suffit de faire une demande GET ou POST à ​​ce point de terminaison et d'analyser les données renvoyées.

Nuit noire
la source
2
Il convient de noter que de nombreux services inspectent les en-têtes HTTP pour s'assurer qu'ils le HTTP_X_REQUESTED_WITHsont XMLHttpRequest. Les bons implémenteront également une sorte de protection XSRF pour les requêtes POST, vous aurez donc également besoin de ce cookie magique. Chatouiller les points de terminaison AJAX non délibérément exposés par certaines API publiques me semble un peu capricieux, et votre grattoir est tout aussi susceptible de se casser si la sortie (ou la politique de demande) change.
Tim Post
@TimPost vous avez 100% raison. Je suis d'accord sur son "icky" en effet :) mais en l'absence de toute API publique, les besoins doivent ..
Darknight
Je pourrais l'utiliser sur ma propre application propulsée par AJAX (et par `` propre '', je ne veux pas dire que je l'ai écrite mais la configuration est la mienne) mais il ne me semblerait pas juste d'essayer de contourner le système d'un autre serveur, donc je dois être d'accord avec @ TimPost, ça fait un peu "dégueu". C'est une bonne idée cependant, merci! +1!
Mike
1

Il n'y a aucun moyen stable ou meilleur de le faire, les pages Web HTML n'ont pas été conçues pour être manipulées par des ordinateurs. C'est pour les utilisateurs humains, mais si vous avez besoin de le faire, je suggère d'utiliser un navigateur et du javascript. Dans mon travail, j'ai été impliqué dans un projet qui a besoin d'extraire des informations d'un site tiers. L'application a été développée comme une extension Chrome. La logique d'application est écrite à l'aide de javascript qui est injecté sur le site une fois le chargement de la page terminé. Les données extraites sont envoyées à une base de données via un serveur http. Ce n'est pas la meilleure approche, mais cela fonctionne. Ps: Le propriétaire du site nous a autorisé à faire une telle chose.

nohros
la source
Je sais que les pages HTML n'étaient pas censées être analysées par les ordinateurs mais parfois il n'y a tout simplement pas d'autre option. De plus, j'utilise des informations accessibles au public pour un projet personnel qui n'est en aucun cas commercial, je ne pense pas avoir besoin d'une autorisation explicite, n'est-ce pas? Merci pour votre contribution! +1 pour vous aussi;)
Mike
@MikeHeremans Pour savoir si vous êtes autorisé à obtenir des informations d'un site Web, lisez les ToS et robots.txt. Si les deux ne vous refusent pas le droit de supprimer automatiquement les informations, vous devriez probablement être OK dans la plupart des cas légalement. Bien sûr, IANAL ...
K.Steff
Si vous souhaitez voir le code du projet mentionné: code.google.com/p/acao-toolkit/source/browse/… . Vérifiez le content_script.js, c'est le code qui est injecté sur la page.
nohros