Parsing en Rust : plus rapide que Python et sans ramasse-miettes

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi Rust est-il le nouveau roi du parsing ?

\n\n

Si vous avez déjà écrit un parser en Python, vous connaissez ce moment : le script fonctionne, les données sont téléchargées, mais soudain — une erreur de mémoire, ou le ramasse-miettes décide de « faire une pause » au pire moment. Familier ? Imaginez maintenant que votre parser vole à la vitesse du C, ne consomme pas de mémoire inutile et soit en plus sécurisé. Bienvenue dans le monde du parsing en Rust.

\n\n

Rust n'est pas seulement un langage à la mode. Pour les tâches de scraping de données, il apporte ce que Python ne pourra jamais offrir : un contrôle total de la mémoire, zéro surcoût lié au ramasse-miettes et une vitesse incroyable. De plus, l'écosystème pour travailler avec HTTP et HTML est déjà suffisamment mature. Dans cet article, je vais vous montrer comment construire un vrai parser en Rust, que vous pourrez utiliser pour la surveillance des prix, la collecte de contenu ou l'analyse SEO.

\n\n

De quoi avons-nous besoin : la boîte à outils Rust pour le parsing

\n\n

Pour le web scraping en Rust, il y a trois piliers :

\n\n
    \n
  • reqwest — le client HTTP. Capable de naviguer sur les sites, supporte l'asynchrone et les proxys.
  • \n
  • scraper (ou select.rs) — la bibliothèque pour le parsing HTML. Permet d'utiliser des sélecteurs CSS.
  • \n
  • tokio — le runtime asynchrone. Sans lui, votre parser ralentira à chaque requête.
  • \n
\n\n

Créons un nouveau projet et installons les dépendances :

\n\n
cargo new rust_parser\ncd rust_parser\ncargo add reqwest --features json\ncargo add scraper tokio
\n\n

Voilà. Maintenant, nous avons tout ce qu'il faut pour écrire un parser en Rust en 10 minutes.

\n\n

Premier parser : récupérer les titres de Habr

\n\n

Commençons simplement : parsons les titres des articles de Habr. C'est un classique du genre, comme le « Hello, World! » pour le scraping en Rust.

\n\n
use scraper::{Html, Selector};\nuse reqwest;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    // 1. Envoyer une requête GET\n    let resp = reqwest::get("https://habr.com/ru/articles/")\n        .await?\n        .text()\n        .await?;\n\n    // 2. Parser le HTML\n    let document = Html::parse_document(&resp);\n\n    // 3. Créer un sélecteur pour les titres\n    let selector = Selector::parse("h2.article-title a").unwrap();\n\n    // 4. Itérer et afficher\n    for element in document.select(&selector) {\n        let title = element.text().collect::<Vec<_>>().join("");\n        println!("{}", title.trim());\n    }\n\n    Ok(())\n}
\n\n

Que se passe-t-il ici ? Nous utilisons reqwest pour une requête asynchrone, scraper pour analyser le HTML et le sélecteur CSS h2.article-title a pour trouver tous les liens dans les titres. Lancez cargo run — et vous voyez la liste des articles. Rapide, n'est-ce pas ?

\n\n

Parsing asynchrone : télécharger 100 pages en une seconde

\n\n

La principale caractéristique du parsing en Rust est l'asynchrone. En Python, vous utiliseriez asyncio et aiohttp, mais Rust avec tokio offre encore plus de contrôle. Parsons plusieurs pages en parallèle.

\n\n
use scraper::{Html, Selector};\nuse reqwest;\nuse tokio::task;\n\nasync fn fetch_page(url: &str) -> Result<String, reqwest::Error> {\n    let resp = reqwest::get(url).await?.text().await?;\n    Ok(resp)\n}\n\nfn parse_titles(html: &str) -> Vec<String> {\n    let document = Html::parse_document(html);\n    let selector = Selector::parse("h2.article-title a").unwrap();\n    document\n        .select(&selector)\n        .map(|el| el.text().collect::<Vec<_>>().join("").trim().to_string())\n        .collect()\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let urls: Vec<String> = (1..=5)\n        .map(|i| format!("https://habr.com/ru/articles/page{}/", i))\n        .coll                

Blogs

Book Recommendations