Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (6008B)
1 #! page 2 title: Comment j\'ai volé 960 arrêts à HUDOC 3 author: Arthur Pons 4 description: Je rigole, c\'est pas du vol c\'est public 5 publication: 2024-05-29 6 7 sectionmd: main 8 9 ## Le besoin 10 11 Un doctorant a besoin de récupérer les pdf et les pleins texte de 960 arrêts de 12 la Cour Européenne des Droits de l'Homme (CEDH). Il a compilé dans un looong 13 excel toutes les informations au sujet de ces arrêts. L'interface graphique 14 d'HUDOC permet de télécharger les pdfs d'un arrêt via un lien à l'apparence du 15 logo pdf. Télécharger tout ça à la main est trop long, il serait utile de les 16 télécharger automatiquement. 17 18 ## Le scraping 19 20 ### Bouton v.s lien 21 22 Mon premier réflexe a été d'étudier la tête du lien pointant vers le pdf et 23 d'identifier s'il existait un pattern. Premier souci, le lien n'est pas une 24 balise `<a>` mais un bouton qui, lorsqu'on clique dessus, déclenche une fonction 25 js qui nous fait télécharger le pdf. 26 27 Dans les outils de développement on identifie plusieurs fichiers. Les fichiers 28 `jquery` ne nous intéressent pas, le fichier `openidconnect.js` à priori ne nous 29 concernent pas. Regardons donc dans `compiled.js`. Faisons une recherche de 30 `pdf` à l'intérieur de ce fichier. On tombe directement sur la fonction suivante 31 : 32 33 DOCUMENT_PDF_URL: function(id, filename, result) { 34 var url; 35 36 if (result.application && result.application.toLowerCase() == "acrobat") { 37 url = API.ROUTES.CONTENT_URL + "/pdf/?library={library}&id={id}&filename={filename}.pdf"; 38 } else { 39 url = API.ROUTES.CONTENT_URL + "/docx/pdf?library={library}&id={id}&filename={filename}.pdf"; 40 } 41 url = url.replace("{library}", API.SITEINFO.GROUP_NAME); 42 url = url.replace("{id}", escape(id)); 43 url = url.replace("{filename}", encodeURIComponent(result.docname)); 44 45 return url; 46 }, 47 48 En mettant un point d'arrêt sur le return et en rechargeant la page on découvre 49 que l'url pour l'arrêt [Case of Zarema Musayeva and others v. 50 Russia](https://hudoc.echr.coe.int/fre#{%22documentcollectionid2%22:[%22GRANDCHAMBER%22,%22CHAMBER%22],%22itemid%22:[%22001-233833%22]}) 51 est 52 53 /app/conversion/docx/pdf?library=ECHR&id=001-233833&filename=CASE%20OF%20ZAREMA%20MUSAYEVA%20AND%20OTHERS%20v.%20RUSSIA.pdf 54 55 On voit donc que l'url est constituée le la bibliothèque, en l'occurence ici la 56 CEDH ou ECHR en anglais, l'identifiant du document et le_nom_de_l'affaire_.pdf. 57 58 A partir de là il est possible de "curler" directement les pdfs. 59 60 ### L'excel 61 62 L'excel fournit par le doctorant a dans sa première colonne le nom de l'affaire 63 et sa troisième le numéro de l'affaire. Autant nous avons besoin du nom, autant 64 le numéro de l'affaire ne correspond pas à l'indentifiant du document dans 65 l'url. Fort heureusement la première colonne est en réalité un lien dont le nom 66 est le nom de l'affaire mais la cible le lien vers la page hudoc du document, 67 lien contenant l'identifiant qui nous intéresse. En gros : 68 69 <a href="https://hudoc.echr.coe.int/fre?i=001-233833">CASE OF ZAREMA 70 MUSAYEVA AND OTHERS v. RUSSIA</a> 71 72 Malheureusement le fait d'avoir encodé cette information dans un lien et non 73 dans une colonne séparée de l'excel rend impossible sa récupération via l'export 74 de l'excel sous forme de [TSV](/amourtsv/). Il va falloir préalablement extraire 75 la cible de chaque lien avant de transformer l'excel en TSV. Pour cela je suis 76 tombé sur [une macro datant de 77 2008](https://forum.openoffice.org/en/forum/viewtopic.php?f=21&t=2762.) qui a 78 fait l'affaire. J'avoue être surpris que cette fonctionnalité ne soit pas 79 intégrée par défaut dans libreoffice calc. Peut-être qu'elle existe mais je ne 80 suis pas parvenu à la trouver. 81 82 En appliquant cette macro on récupère les liens, que l'on nettoie pour n'avoir 83 que les identifiants. On obtient un format du type : 84 85 HÄMÄLÄINEN V. FINLAND 001-145768 86 ILGAR MAMMADOV V. AZERBAIJAN (INFRINGEMENT PROCEEDINGS) 001-193543 87 KLAUS AND IOURI KILADZE V. GEORGIA 88 O’DONOGHUE AND OTHERS V. THE UNITED KINGDOM 001-102266 89 A AND OTHERS V. THE UNITED KINGDOM 001-91403 90 A, B AND C V. IRELAND 001-102332 91 A. AND OTHERS V. THE UNITED KINGDOM 001-91403 92 A. V. THE NETHERLANDS 001-100038 93 A.A. AND OTHERS V. NORTH MACEDONIA 001-216861 94 A.A. V. THE UNITED KINGDOM 001-106282 95 96 Ce fichier est téléchargeable [ici (39Ko)](data.tsv). 97 98 ### Le téléchargement 99 100 Pour finir préparons le téléchargement des pdfs. On peut créer un dossier pdfs 101 pour les contenir. On lit les lignes de notre TSV avec une boucle while : 102 103 while read case 104 do 105 ... 106 done < cases.tsv 107 108 Dans la boucle on transforme le nom des affaires pour que ça colle aux url, on 109 récupère l'identifiant et on prépare le nom du fichier à créer : 110 111 while read case 112 do 113 filename=$(echo "$case" | cut -f1 | tr ' ' '-') 114 urlname=$(echo "$case" | cut -f1 | sed -E 's/ /%20/g') 115 id=$(echo "$case" | cut -f2) 116 ... 117 done < cases.tsv 118 119 Puis on lance le téléchargement si le fichier n'existe pas déjà : 120 121 while read case 122 do 123 filename=$(echo "$case" | cut -f1 | tr ' ' '-') 124 urlname=$(echo "$case" | cut -f1 | sed -E 's/ /%20/g') 125 id=$(echo "$case" | cut -f2) 126 if [ ! -e "pdfs/$filename.pdf" ] 127 then 128 echo "downloading $filename" 129 wget --quiet "https://hudoc.echr.coe.int/app/conversion/docx/pdf?library=ECHR&id=$id&filename=$urlname.pdf" -O "pdfs/$filename.pdf" 130 else 131 echo "skipping $filename" 132 fi 133 done < cases.tsv 134 135 ## Le plein texte 136 137 Le doctorant souhaite faire des analyses automatiques des textes des arrêts. 138 Avoir le texte des pdfs dans des fichiers textes l'intéresse. Pour cela on peut 139 utiliser `pdftotext` : 140 141 find -name '*.pdf' -print0 | xargs -n1 -0 -P4 pdftotext 142 143 Cette commande génèrera dans le dossier `pdfs` les .txt correspond aux pdfs 144 quatre par quatre. In fine on pourra ranger les txt en faisant quelque chose 145 comme : 146 147 mkdir txt 148 mv *.txt txt 149 150 endsection