entrepreneur-interet-general / CIS-front

Site public du carrefour des innovations sociales
http://carrefourdesinnovationssociales.fr/
MIT License
7 stars 5 forks source link

Site COORACE mal scrapé : pas de description / pas d'image #162

Open Eliselalique opened 6 years ago

Eliselalique commented 6 years ago
capture d ecran 2018-11-23 a 14 48 09

Pour la moitié des projets Coorace : -> La description est vide : "partager" -> Il n'y a pas de photos Alors que ces deux informations existent bien sur le site de COORACE

Eliselalique commented 5 years ago

-> Xpath des scrapers à régler

DavidBruant commented 5 years ago

En copiant la spider telle quelle, j'arrive à avoir les images et les descriptions en local Je rencontre toutefois le problème de récupérer toutes les images de tous les projets pour chaque projets

Si mon souvenir est exact, @JulienParis m'a dit que les mêmes xpath sont lancés à la fois sur les pages "listes" et sur les pages "détail". Et dans le cas de ce site, le HTML est très proche pour ces deux pages, donc le xpath d'image sur la page "détail" (où il n'y a qu'une seule image), quand utilisé sur la page "liste" (où il y a toutes les images de tous les projets) ramène tout

Côté solution, il existe sûrement un xpath complexe et subtile qui permet de différencier les deux pages remettre en question cette partie du design d'OpenScrapper est une autre option

DavidBruant commented 5 years ago

différencier les deux pages

Pour les 3 pages de liste, document.body.querySelectorAll('*').length donne des valeurs autour de 950-1100 Pour quelques pages projet que j'ai regardé, document.body.querySelectorAll('*').length donne une valeur autour de 300-350

Une idée peut être de discriminer par le nombre d'éléments derrière le body avec un truc genre //body[count(//*) > 700]

DavidBruant commented 5 years ago

Trouvé un xpath qui fonctionne pour les images : //body[count(//*) < 700]//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//svg/following-sibling::img/@src

Les images principales ont un filtre SVG qui est défini en sibling précédent

DavidBruant commented 5 years ago

Avec /html/body/div/div/div[4]/div/main/div[2]/div[2]/div/div/div[2]/div[1][h6 or p]//text() (!) j'arrive à avoir la plupart des résumés (pas encore tous), mais je crois que le même problème d'ordre des paragraphes que #255 vient se rajouter

DavidBruant commented 5 years ago

Trouvé une idée pour récupérer le résumé :
string(//body[count(//*) < 700]//div[@id="SITE_PAGES"]//*[not(self::style or self::script)][string-length(text()) >= 50])

[string-length(text()) >= 50] signifie de récupérer tout élément de la page qui a plus de 50 caractères. C'est un peu grossier, mais ça a l'air de faire l'affaire

J'avais essayé //body/...//*[not(self::style or self::script)][string-length(text()) >= 50] et j'avais le même problème d'ordre des paragraphes (dont je suis de plus en plus convaincu qu'il s'agit d'un bug de la bibliothèque)\ L'astuce string(...) a ceci de cool qu'elle a l'air de récupérer les éléments dans l'ordre... mais les paragraphes ne sont pas conservés... :-/ on n'a qu'à dire que ça peut aller pour le moment et on verra si ça devient un problème grave

DavidBruant commented 5 years ago

Pour une raison qui m'échappe complètement, en local, tous les projets ont une image avec //body[count(//*) < 700]//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//svg/following-sibling::img/@src, mais en prod, environ seulement la moitié des images est récupéré

DavidBruant commented 5 years ago

En local, j'ai la branche master actuelle

@JulienParis est-ce que le cas pour le serveur de prod ?

JulienParis commented 5 years ago

on peut récupérer les résumés/descriptions avec .//div[@class="txtNew"]//p[@class="font_7" or @class="font_8"]//text() : le problème vient du site (ou de son développeur) qui affiche les textes avec des classes, des positions différentes selon les articles...

mais moi non plus j'arrive pas à m'expliquer pourquoi ni .//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//img/@src ni //body[count(//*) < 700]//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//svg/following-sibling::img/@src ne fonctionnent pas correctement (1 image sur 2 ??? WTF ??? pas du tout ou toutes je comprendrais, mais là)...

J'ai aussi tenté de récupérer les images avec .//div[contains(@class,'style-')]/div/img/@src : ca marche dans le plugin de firefox mais pas tout le temps avec scrappy... :/