arthur.bebou

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