[R] Récupération de données de pages html

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

[R] Récupération de données de pages html

#1

Message par guenfood »

Bonjour,

Je cherche à récupérer des informations sur des fiches de livres sur un site, afin d'alimenter un fichier csv, qui sera exploité par la suite pour enrichir une base de données.

Un début de script a déjà été fait, mais il reste quelques ajustements à intégrer que je n'arrive pas à mettre en place.
Actuellement, le script me permet bien de récupérer les informations demandées, en fonction d'un fichier source (en pièce jointe) qui comprend X lignes avec les X ISBN qui m'intéressent.
Le problème est que le fichier csv créé n'est pas uniforme pour pouvoir être exploité derrière (voir exemple en pièce jointe)
Si une des données est manquante sur la page html cible, il faudrait que la cellule correspondante dans le fichier csv créé soit vide.
De plus, au lieu d'avoir une ligne par fiche, j'ai parfois 2 lignes de créées.

Enfin, il faudrait également inclure dans le script, la récupération du lien de l'image compris dans la balise

Code : Tout sélectionner

<meta property="og:image"
et également prévoir les futures mises à jour en faisant en sorte que si la cellule du fichier csv déjà créé n'est pas vide, il ne faut pas réécrire par dessus.
Voici le script tel qu'il existe à ce jour.
Merci par avance pour votre aide. S'il manque des informations, je suis à votre disposition :
► Afficher le texte
Fichiers joints

[L’extension csv a été désactivée et ne peut plus être affichée.]

[L’extension csv a été désactivée et ne peut plus être affichée.]

Modifié en dernier par guenfood le lun. 07 avr. 2014 13:32, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupération de données de pages html

#2

Message par mikell »

guenfood a écrit :Si une des données est manquante sur la page html cible, il faudrait que la cellule correspondante dans le fichier csv créé soit vide.
C'est ça le point délicat, quelle(s) donnée(s) est/sont susceptibles de manquer ?
Si on parle de données dans les informations techniques du livre, alors faudrait peut-être passer par une array 2D pour noter les définitions des données recueillies avec une bonne gestion d'erreur
► Afficher le texte
Si une donnée manque (case vide dans le tableau sur la page internet) ça fera une case vide dans l'array et une fois retranscrit un vide dans la ligne du csv
► Afficher le texte
à condition bien sûr que les lignes du csv aient une structure constante, par exemple dans le cas de mon code :
"description;image;prix;Date de parution;Editeur;Collection;ISBN;EAN, Présentation;Nb. de pages;Poids;Dimensions"
Et les données sont toutes prêtes pour remplir la bdd Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Récupération de données de pages html

#3

Message par jchd »

J'ai trouvé utile de faire un bout de code pour passer d'une variable ou d'un tableau AutoIt (0D, 1D ou 2D) à un ".CSV amélioré" (et vice-versa) qui préserve les types de données. Ainsi, je considère NULL comme distinct d'une chaîne vide, je gère les structures, les fonctions, etc. On peut aussi transposer depuis/vers un tableau 2D.

On peut donc préserver les types entre une BDD et un tableau. Le code est brut de décoffrage et mes maigres commentaires sont en nangliche, dézolède.

Le code ne cherche pas la vélocité et peut s'avérer poussif sur les grands tableaux...
► Afficher le texte
M'indiquer les bugs, svp.

Ah oui : je n'ai pas géré de ligne d'entête avec nom des champs.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

Re: [..] Récupération de données de pages html

#4

Message par guenfood »

Merci à vous pour votre aide.

Etant au boulot, et derrière un proxy (je n'ai pas encore réussi à implémenter de quoi prendre en compte la gestion de proxy), je ne peux pas tester dans l'immédiat.

Je vais tester ça ce soir à la maison et vous tiens informés des résultats.

PS : Mikell, les données qui peuvent être manquantes sont bien celles présentes dans la fiche technique.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupération de données de pages html

#5

Message par mikell »

Je n'ai pas testé tous les codes du csv mais si tu pouvais fournir un exemple (référence/lien) où une telle donnée est manquante ça permettrait d'être beaucoup plus précis sur la démarche et donc peut-être d'alléger le script
La bdd c'est du SQLite ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

Re: [..] Récupération de données de pages html

#6

Message par guenfood »

Voici un lien où la partie "Dimensions" du livre est absente : http://www.decitre.fr/livres/promotion- ... 21003.html
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupération de données de pages html

#7

Message par mikell »

Eh ben ... c'est pas gagné :mrgreen:
Effectivement la partie "Dimensions" est absente mais aussi les parties "Collection" et "Nb. de pages" , mais par contre ya la partie "Format" en plus ...

On a 2 possibilités :
- ou bien tu es restrictif sur les données techniques que tu collectes de manière à ne récupérer que des données communes à tous les bouquins
- ou bien tu veux collecter le maximum de données et dans ce cas le passage par l'array 2D (cf. mon code précédent) est incontournable, avec une 1ère colonne qui récupèrera les divers "intitulés" techniques ("Date de parution", "Editeur", "Collection", "ISBN", "EAN", etc) qui devront correspondre à des champs équivalents du csv et à des titres de colonnes équivalents de la bdd, et un remplissage de la bdd qui se fera par création "INSERT INTO table (intitulé1, intitulé2, intitulé3, ...) VALUES (valeur1, valeur2, valeur3, ...)" ou updates "UPDATE table SET intitulé1 = valeur1 WHERE colonne_EAN = valeur_EAN" en piochant les infos dans l'array 2D ou le csv
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupération de données de pages html

#8

Message par jguinch »

@guenfood : juste par curiosité, ça ne serait pas pour injecter dans un PMB par hasard ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupération de données de pages html

#9

Message par Tlem »

guenfood a écrit :Je cherche à récupérer des informations sur des fiches de livres sur un site, afin d'alimenter un fichier csv
Bonsoir.
Juste pour rappeler que la collecte d'information sur un site internet est soumise à l'approbation du détenteur du site en question.

Si le site vous appartient, alors pas de problème, mais si il appartient à quelqu'un d'autre, lisez bien le règlement de celui-ci. Car au cas ou vous seriez dans l'illégalité et que le proprio porte plainte, cela peux couter très cher. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

Re: [..] Récupération de données de pages html

#10

Message par guenfood »

jguinch a écrit :@guenfood : juste par curiosité, ça ne serait pas pour injecter dans un PMB par hasard ?
Oui, c'est dans cet optique. Ce n'est pas à proprement parlé un PMB, mais un logiciel de gestion de bibliothèque.
Tlem a écrit :Bonsoir.
Juste pour rappeler que la collecte d'information sur un site internet est soumise à l'approbation du détenteur du site en question.

Si le site vous appartient, alors pas de problème, mais si il appartient à quelqu'un d'autre, lisez bien le règlement de celui-ci. Car au cas ou vous seriez dans l'illégalité et que le proprio porte plainte, cela peux couter très cher. ^^
Des logiciels, en accès libre ou en vente, permettent de gérer sa bibliothèque en récupérant les informations relatives aux livres.
J'utilise Data Crow en ce qui me concerne, qui va récupérer des informations essentiellement sur Amazon (seul site français référencé dans le logiciel).
Intégrer d'autres sites demandent des compétences java que je n'ai pas, et je souhaite avoir une base avec le maximum de données.
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

Re: [..] Récupération de données de pages html

#11

Message par guenfood »

Après quelques recherches supplémentaires sur la toile, je suis tombé sur un site, dont le code source est un peu mieux structuré pour récupérer les infos.
C'est sur Placedeslibraires.fr

Voici un exemple de livre qui comprend toutes les données à récupérer : http://www.placedeslibraires.fr/detaill ... 2266243216

Le lien des images est toujours sous la forme : http://images.titelive.com/3 derniers chiffres du gencod/numerodugencod_1_75.jpg
Les informations sur le nom de l'auteur, le titre du livre, le nom de l'éditeur et le prix sont dans la <div class="metaLivre">
Les autres informations sont la <div id="bloc_infos"> (Collection, Parution, Genre, EAN, Nb de pages, Dimension, Poids, Résumé).

Les autres informations comme biographie de l'auteur ne sont pas nécessaires.

Sachant que certains livres ne disposent pas de toutes ces informations (exemple : Collection, ou Dimension), et qu'il est fort possible que sur la liste de tous les ISBN qui m'intéressent, certains ne soient pas présents sur le site (et que je sache dans mon fichier de sortie les ISBN manquants).
Comment réagencer le code de départ pour en faire un script conforme à mes besoins et entièrement fonctionnel ?

Merci encore à vous, et promis, je ne vous embête plus avec ce script :mrgreen:
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupération de données de pages html

#12

Message par mikell »

Ah ben zut alors, je termine juste et vlà que tu changes de site ^^
M'enfin bon comme on dit l'important c'est de participer... :mrgreen:
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

Re: [..] Récupération de données de pages html

#13

Message par guenfood »

Merci pour ton retour Mikell.

J'ai testé ton code, en faisant la modification suivante pour qu'il lise bien le fichier csv source :

Code : Tout sélectionner

local $FichierCsv = "Stock Librairie.csv"
local $file = FileRead($FichierCsv)

;~local $file = "9782351555125" & @crlf & _
        ;~"9782264056405" & @crlf & _
        ;~"9782264061614" & @crlf & _
        ;~"9782264056245" & @crlf & _
        ;~"9782264058478" & @crlf & _
        ;~"9782264056764" & @crlf & _
        ;~"9782264054623" & @crlf & _
       ;~ "9782264056139" & @crlf & _
       ;~ "9782264059321" & @crlf & _
        ;~"9782264055750"
Le script tourne, mais le fichier sortie stock.csv n'est pas généré.
Alors qu'avec ton code initial, j'ai bien le fichier généré avec les 10 ISBN renseigné dans local $file

Edit : Au temps pour moi, le fichier bien généré mais à la fin de l'exécution du script. Dans la première version, le fichier était créé immédiatement.

Cela semble bon au final. Il reste juste quelques soucis.
La description (résumé du livre) est parfois coupée et reportée sur une ligne en dessous.
Ensuite, Titre et Auteur sont dans le même item, alors qu'ils doivent faire l'objet d'un item chacun.
Enfin, le prix récupéré n'est pas le bon.

Je joins un exemple de fichier généré avec ton code (j'ai stoppé le script au bout de quelques secondes pour qu'il ne soit pas trop lourd).

Je pense que ces "bugs" viennent du fait que la description est récupérée dans

Code : Tout sélectionner

<meta property="og:description"
au lieu de

Code : Tout sélectionner

<div id="description">
Dès qu'il y a un &quot, cela occasionne un saut de champ.
Fichiers joints

[L’extension csv a été désactivée et ne peut plus être affichée.]

Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupération de données de pages html

#14

Message par mikell »

Pour le prix, ne sachant pas lequel prendre j'ai choisi au hasard le "prix éditeur" dans le cadre à droite de la page
Séparer le titre et l'auteur et prendre la description ailleurs dans le source ne demandent qu'une modification mineure du script
► Afficher le texte
En fait ce code n'est qu'un exemple, il est basique et ce qui devrait t'interpeller dedans c'est essentiellement sa construction :
- en gardant les mêmes principe/structure tu peux l'adapter pour travailler sur d'autres sites, ce qui ne serait peut-être pas une mauvaise idée d'ailleurs parce que si ces sites sont plus légers tu gagneras en vitesse d'exécution
- pour le choix des données à prélever dans les pages il faut t'intéresser aux expressions régulières (StringRegExp), très efficaces pour l'extraction de strings
Si l'expérience te tente, je peux te commenter les lignes :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupération de données de pages html

#15

Message par jguinch »

Code : Tout sélectionner

#Include "mikell.au3"
:D
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

Re: [..] Récupération de données de pages html

#16

Message par guenfood »

Merci Mikell. C'est super.

Evidemment, je suis preneur pour avoir le code commenté.
Pour comprendre un peu mieux comment tout fonctionne, comment modifier les champs et l'adapter pour chercher les données sur d'autres sites (comme Placedeslibraires notamment).
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Récupération de données de pages html

#17

Message par mikell »

Voilà le code commenté
Le seul point un peu délicat est que les données sont réparties dans l'array-résultat $res de 2 manières différentes avec 2 mécanismes différents :
- pour les données dont on est sûr qu'elles seront toujours présentes (titre, auteur etc) la donnée est récupérée et son index dans l'array $res est attribué d'office d'après l'index correspondant dans l'array de référence $tech
- pour les données qui peuvent être présentes ou pas, l'intitulé de chaque donnée est récupéré d'abord et comparé aux index dans l'array de référence $tech, si une correspondance est trouvée l'index est attribué, sinon la cellule reste vide

Dans ce code la bdd est remplie progressivement mais le csv n'est créé qu'à la sortie de la boucle
On pourrait aussi faire un remplissage progressif du csv mais ça consommerait sans doute plus de ressources

J'espère avoir été assez clair Image
► Afficher le texte
Edit
Pour le fun et comme exercice d'application, le code équivalent pour le 2ème site (la gestion est plus simple, on utilise juste le mécanisme n°1 cité avant) avec en bonus la fonction de conversion des caractères html par notre inénarrable matwachich
Attention ici le flag pour BinaryToString est à 1 (ANSI)
► Afficher le texte
jguinch a écrit :

Code : Tout sélectionner

#Include "mikell.au3"
:D
Scilicet, hoc factum est :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
guenfood
Niveau 1
Niveau 1
Messages : 11
Enregistré le : lun. 31 mars 2014 13:28
Status : Hors ligne

Re: [..] Récupération de données de pages html

#18

Message par guenfood »

Super Mikell.
Le dernier code est parfait.
Merci beaucoup.

Je suis en train de regarder un dernier point dans ce code, car la description (résumé du livre) est systématiquement sur plusieurs lignes.
Dès qu'il y a un saut de ligne dans le résumé (dans le code source), il est repris dans le csv. Quand j'affiche le code source, je constate que ces sauts de lignes ne sont pas effectués avec des balises <br>.
Y a t'il quelque chose à rajouter dans la portion de code suivante pour empêcher cela ?

Code : Tout sélectionner

$item = StringRegExp($source, '(?s)class="bloc_presentation">([^<]+)', 3)
    If IsArray($item) Then $res[5] = $item[0]
 
Edit : C'est bon, je pense avoir trouvé. Voilà le code modifié

Code : Tout sélectionner

If IsArray($item) Then $res[5] = StringRegExpReplace ($item[0], @lf, " ")
Répondre