J'utilise php pour gratter un site Web et collecter des données. Tout est fait sans utiliser Regex. J'utilise la méthode d'explosion de PHP () pour trouver des balises HTML particulières à la place. P>
Il est possible que si la structure du site change (CSS, HTML), les données erronées peuvent être collectées par le grattoir. Donc, la question est - comment puis-je savoir si la structure HTML a changé? Comment l'identifier avant de stocker des données sur ma base de données pour éviter les mauvaises données stockées. p>
6 Réponses :
Premièrement, dans certains cas, vous voudrez peut-être comparer HASHES de la original au nouveau HTML. MD5 et SHA1 sont deux hachages populaires. Cela peut être valable ou non dans toutes les circonstances mais que vous devriez être familier avec. Cela vous dira si quelque chose a changé - contenu, tags ou quoi que ce soit. p>
Pour comprendre si la structure a changé, vous devez capturer un histogramme des occurrences d'étiquette, puis comparez celles-ci. Si vous vous souciez des balises étant en panne, vous devrez capturer un arbre des balises et faire une comparaison pour voir si les balises se produisent dans le même ordre. Cela va être très spécifique à ce que vous voulez réaliser. P>
PHP Simple HTML DOM Parser est un outil qui vous aidera à analyser le HTML. P>
@Brainly: Juste parce que le nouveau fichier HTML a un hachage différent, ne signifie pas que la structure HTML a changé.
Les hachages toujours i> diffèrent car les données que je grattent des changements sur une base horaire! Ce que je voulais dire était, et si elles ont changé la conception du site, comment cela peut-il être détecté de manière efficace?
Les pages dynamiques produiront systématiquement différentes haubes, généralement sans changements structurels majeurs.
Vous êtes correct, j'ai mal interprété la question initiale. J'ai ajouté plus de détails sur la façon dont vous pourriez comparer la structure. J'aurais tendance à utiliser le hachage comme une vérification initiale avant de faire quelque chose de plus compliqué pour économiser sur certains traitements. La valeur va dépendre du nombre de pages.
Haquet n'est pas une stratégie valide.
@SystemPuntoout Les hachages pourraient être valables, en fonction de ce qui est haché ici. Comme le dit Brain Lytle, vous pouvez avoir atteint la structure de l'arbre et voir si cela correspond au hachage de la structure actuelle. Cela pourrait très bien être valable dans ce cas. Les données de hachage ne sont probablement pas une stratégie valide comme vous l'avez dit.
Je pense que vous n'avez aucune solution propre si vous grattez une page lorsque le contenu change. p>
J'ai développé plusieurs racleurs Python et je sais comment peut être frustrant lorsque le site fait un changement subtil sur sa mise en page. P>
Vous pouvez essayer une solution à la mécanisée (je ne connais pas la contrepartie PHP) et si vous avez de la chance, vous pouvez isoler le contenu que vous devez extraire (liens?). P>
Une autre approche possible serait de coder certaines contraintes et de les vérifier avant que le stockage de DB. P>
Par exemple, si vous supprimez des URL, vous devrez vérifier que quel grattoir a analysé est formellement une URL valide; idem pour l'ID entier ou tout ce que vous voulez gratter peut être reconnu comme valide. P>
Si vous grattez du texte brut, il sera plus difficile de vérifier. P>
Hey c'est moi. Désolé parce que ce n'était pas intentionnel !! J'ai appuyé sur le mauvais bouton et je ne suis pas capable de le changer. Il dit - «Votez trop vieux pour être changé, à moins que cette réponse soit modifiée». Désolé encore, veuillez vous modifier la réponse afin que je puisse le voter. Ce n'était pas intentionnel.
exploser () code> n'est pas un analyseur HTML, mais que vous souhaitez connaître les modifications de la structure HTML. Ça va être délicat. Essayez d'utiliser un analyseur HTML. Rien d'autre ne pourra le faire correctement. P>
Si vous voulez connaître des changements en ce qui concerne la structure, je pense que le meilleur moyen est de stocker la structure DOM de votre première page, puis de le comparer avec un nouveau. P>
Il y a beaucoup de choses que vous pouvez le faire: - Saxparser Domparser, etc. p>
J'ai un petit blog qui donnera quelques pointeurs à ce que je veux dire http: // let-them- c.blogspot.com/2009/04/XML-AS-Objects-in-oops.html P>
ou vous pouvez utiliser http://en.wikipedia.org/wiki/simple_api_for_xml ou dom utilitaire d'analyseur. p>
Vous devez faire très attention lorsque vous essayez d'utiliser des analyseurs XML avec HTML. Ils ont tendance à faire exploser au moindre HTML malformé.
Parler de mon cul ici, mais sa possible, vous voudrez peut-être examiner certains méthodes PHP de modèle d'objet de document. P>
http://php.net/manual/fr/book.dom.dom.php p>
Si ma compréhension très limitée de DOM est correcte, une modification de la structure du site HTML modifierait le modèle d'objet de document, mais un changement de contenu simple dans une structure fixe ne le ferait pas. Donc, si vous pouviez capturer l'état DOM, puis vous le comparez à chaque grattage, n'est-ce pas en théorie pour déterminer qu'un tel changement a été fait? P>
(Au fait, la façon dont je l'ai fait lorsque j'essayais d'obtenir une notification par courrier électronique lorsque les résultats de l'examen de barre ont été affichés sur une page particulière, il suffit de comparer les valeurs file_get_contents (). Surprenant, a fonctionné parfaitement: pas de faux positifs, et m'a envoyé un courriel dès que le site a publié le contenu.) p>
dépend du site, mais vous pouvez compter le nombre d'éléments de page dans la page raclée comme des balises de div, de classe et de style, puis en comparant ces totaux contre ceux des éraflures ultérieures détectant si la structure de la page a été modifiée. P>
Un processus similaire pourrait être utilisé pour le fichier CSS où les noms de chaque classe ou id peuvent être extraits à l'aide d'une simple regex, stockée et vérifiée au besoin. Si cette liste a de nouvelles ajouts, la structure de la page a presque certainement changé quelque part sur le site étant gratté. P>