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 .
Réponses:
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).
la source
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 .
la source
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.
la source
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.
la source
HTTP_X_REQUESTED_WITH
sontXMLHttpRequest
. 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.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.
la source