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