Edit : finalement je crois que je vais juste extraire quelques fonctions utiles dans un fichier, et le copier et l’éditer pour chaque tache spécifique. Les frameworks comme scrapy ou gocolly sont faits pour tout à fait autre chose que mes cas d’usage, où il s’agit surtout de sélectionner au plus quelques centaines de liens, et de faire quelques téléchargements en parallèle.


Par exemple avec un sélecteur CSS récolter tous les fichiers PDF d’une page, et leur donner le nom du texte du lien. Je peux le faire avec la console de firefox et des scripts simples ou même un simple fichier pour wget, mais je me demandais s’il n’y avait pas déjà quelque chose qui rend tout ça très facile.

J’ai déjà un projet exemple pour faire des manips vitef avec node.js, mais je me demandais s’il n’existait pas quelque chose de plus intégré et facile d’usage. Je connais bien scrapy en python, mais j’ai jamais compris comment bien l’utiliser et surtout faire sortir proprement les données de son système.


Mon fichier exemple pour node.js, pour sortir du markdown plus simple que ce que sortait pandoc avec le HTML entier :

#!/usr/bin/env node
import { join } from 'node:path'
import { writeFile, mkdir } from "node:fs/promises"
import { JSDOM } from "jsdom"

const URL = "https://reflets.info/articles/comment-les-fascistes-et-neonazis-batissent-la-guerre-civile"
const SELECTOR = ":is(p, img)"
const OUTDIR = "terrorgram"


await mkdir(join(OUTDIR, "img"), {recursive: true})

const {window: {document}} = await JSDOM.fromURL(URL)

let img_num = 0
const downloads = []
const fragments = []
for (const el of document.querySelectorAll(SELECTOR)) {
	switch (el.tagName) {
		case "P":
			if (el.textContent.length != 0) {
				fragments.push(el.textContent)
			}
			break
		case "IMG":
			fragments.push(`![](./img/${img_num++})`)
			const filename = join(OUTDIR, "img", img_num.toString())
			const download = fetch(el.src).then(res => writeFile(filename, res.body))
			downloads.push(download)
			break
		default:
			throw new Error(`Type de balise HTML non pris en charge : ${el.tagName}`)
	}
	fragments.push("\n\n")
}

const write = writeFile(join(OUTDIR, "terrorgram.md"), fragments)

await Promise.all([write, ...downloads])