Comment j'ai volé 960 arrêts à HUDOC

Retour accueil


Le besoin

Un doctorant a besoin de récupérer les pdf et les pleins texte de 960 arrêts de la Cour Européenne des Droits de l’Homme (CEDH). Il a compilé dans un looong excel toutes les informations au sujet de ces arrêts. L’interface graphique d’HUDOC permet de télécharger les pdfs d’un arrêt via un lien à l’apparence du logo pdf. Télécharger tout ça à la main est trop long, il serait utile de les télécharger automatiquement.

Le scraping

Bouton v.s lien

Mon premier réflexe a été d’étudier la tête du lien pointant vers le pdf et d’identifier s’il existait un pattern. Premier souci, le lien n’est pas une balise <a> mais un bouton qui, lorsqu’on clique dessus, déclenche une fonction js qui nous fait télécharger le pdf.

Dans les outils de développement on identifie plusieurs fichiers. Les fichiers jquery ne nous intéressent pas, le fichier openidconnect.js à priori ne nous concernent pas. Regardons donc dans compiled.js. Faisons une recherche de pdf à l’intérieur de ce fichier. On tombe directement sur la fonction suivante :

DOCUMENT_PDF_URL: function(id, filename, result) {  
    var url;

    if (result.application && result.application.toLowerCase() == "acrobat") {
        url = API.ROUTES.CONTENT_URL + "/pdf/?library={library}&id={id}&filename={filename}.pdf";
    } else {
        url = API.ROUTES.CONTENT_URL + "/docx/pdf?library={library}&id={id}&filename={filename}.pdf";   
    }
    url = url.replace("{library}", API.SITEINFO.GROUP_NAME);            
    url = url.replace("{id}", escape(id));  
    url = url.replace("{filename}", encodeURIComponent(result.docname));        

    return url;
},

En mettant un point d’arrêt sur le return et en rechargeant la page on découvre que l’url pour l’arrêt Case of Zarema Musayeva and others v. Russia est

/app/conversion/docx/pdf?library=ECHR&id=001-233833&filename=CASE%20OF%20ZAREMA%20MUSAYEVA%20AND%20OTHERS%20v.%20RUSSIA.pdf

On voit donc que l’url est constituée le la bibliothèque, en l’occurence ici la CEDH ou ECHR en anglais, l’identifiant du document et lenomdel’affaire.pdf.

A partir de là il est possible de “curler” directement les pdfs.

L’excel

L’excel fournit par le doctorant a dans sa première colonne le nom de l’affaire et sa troisième le numéro de l’affaire. Autant nous avons besoin du nom, autant le numéro de l’affaire ne correspond pas à l’indentifiant du document dans l’url. Fort heureusement la première colonne est en réalité un lien dont le nom est le nom de l’affaire mais la cible le lien vers la page hudoc du document, lien contenant l’identifiant qui nous intéresse. En gros :

<a href="https://hudoc.echr.coe.int/fre?i=001-233833">CASE OF ZAREMA
MUSAYEVA AND OTHERS v. RUSSIA</a>

Malheureusement le fait d’avoir encodé cette information dans un lien et non dans une colonne séparée de l’excel rend impossible sa récupération via l’export de l’excel sous forme de TSV. Il va falloir préalablement extraire la cible de chaque lien avant de transformer l’excel en TSV. Pour cela je suis tombé sur une macro datant de 2008 qui a fait l’affaire. J’avoue être surpris que cette fonctionnalité ne soit pas intégrée par défaut dans libreoffice calc. Peut-être qu’elle existe mais je ne suis pas parvenu à la trouver.

En appliquant cette macro on récupère les liens, que l’on nettoie pour n’avoir que les identifiants. On obtient un format du type :

HÄMÄLÄINEN V. FINLAND   001-145768
ILGAR MAMMADOV V. AZERBAIJAN (INFRINGEMENT PROCEEDINGS) 001-193543
KLAUS AND IOURI KILADZE V. GEORGIA  
O’DONOGHUE AND OTHERS V. THE UNITED KINGDOM 001-102266
A AND OTHERS V. THE UNITED KINGDOM  001-91403
A, B AND C V. IRELAND   001-102332
A. AND OTHERS V. THE UNITED KINGDOM 001-91403
A. V. THE NETHERLANDS   001-100038
A.A. AND OTHERS V. NORTH MACEDONIA  001-216861
A.A. V. THE UNITED KINGDOM  001-106282

Ce fichier est téléchargeable ici (39Ko).

Le téléchargement

Pour finir préparons le téléchargement des pdfs. On peut créer un dossier pdfs pour les contenir. On lit les lignes de notre TSV avec une boucle while :

while read case
do
    ...
done < cases.tsv

Dans la boucle on transforme le nom des affaires pour que ça colle aux url, on récupère l’identifiant et on prépare le nom du fichier à créer :

while read case
do
    filename=$(echo "$case" | cut -f1 | tr ' ' '-')
    urlname=$(echo "$case" | cut -f1 | sed -E 's/ /%20/g')
    id=$(echo "$case" | cut -f2)
    ...
done < cases.tsv

Puis on lance le téléchargement si le fichier n’existe pas déjà :

while read case
do
    filename=$(echo "$case" | cut -f1 | tr ' ' '-')
    urlname=$(echo "$case" | cut -f1 | sed -E 's/ /%20/g')
    id=$(echo "$case" | cut -f2)
    if [ ! -e "pdfs/$filename.pdf" ]
    then
        echo "downloading $filename"
        wget --quiet "https://hudoc.echr.coe.int/app/conversion/docx/pdf?library=ECHR&id=$id&filename=$urlname.pdf" -O "pdfs/$filename.pdf"
    else
        echo "skipping $filename"
    fi
done < cases.tsv

Le plein texte

Le doctorant souhaite faire des analyses automatiques des textes des arrêts. Avoir le texte des pdfs dans des fichiers textes l’intéresse. Pour cela on peut utiliser pdftotext :

find -name '*.pdf' -print0 | xargs -n1 -0 -P4 pdftotext

Cette commande génèrera dans le dossier pdfs les .txt correspond aux pdfs quatre par quatre. In fine on pourra ranger les txt en faisant quelque chose comme :

mkdir txt
mv *.txt txt