Comment récupérer des pages Web à partir de la ligne de commande à l’aide de htmlq
Le web scraping est le processus d’analyse de la structure des pages HTML et d’extraction programmatique de données à partir de celles-ci. Par le passé, nous avons vu comment gratter le web en utilisant le langage de programmation Python et la bibliothèque « Beautilful Soup » ; dans ce tutoriel, à la place, nous voyons comment effectuer la même opération à l’aide d’un outil en ligne de commande écrit en Rust : htmlq.
Dans ce tutoriel, vous allez apprendre :
- Comment installer cargo et htmlq
- Comment ajouter le répertoire ~/.cargo/bin à PATH
- Comment gratter une page avec curl et htmlq
- Comment extraire une balise spécifique
- Comment obtenir la valeur d’un attribut de balise spécifique
- Comment ajouter des URL de base aux liens
- Comment utiliser les sélecteurs css
- Comment obtenir du texte entre les balises
Configuration logicielle requise et conventions utilisées
Installation
Htmlq est une application écrite à l’aide de Rust, un langage de programmation à usage général, syntaxiquement similaire au C++. Cargo est le gestionnaire de paquets Rust : c’est en gros ce que pip est pour Python. Dans ce tutoriel, nous allons utiliser Cargo pour installer l’outil htmlq, donc la première chose que nous devons faire est de l’installer dans notre système.
Installation de la cargaison
Le paquet « cargo » est disponible dans les dépôts de toutes les distributions Linux les plus couramment utilisées. Pour installer « Cargo » sur Fedora, par exemple, il suffit d’utiliser le gestionnaire de paquets dnf :
sudo dnf install cargoSur Debian et les distributions basées sur Debian, une façon moderne d’effectuer l’installation est d’utiliser le wrapper apt, qui est conçu pour fournir une interface plus conviviale aux commandes telles que apt-get et apt-cache. La commande que nous devons exécuter est la suivante :
sudo apt install cargoSi Archlinux est notre distribution Linux préférée, tout ce que nous avons à faire est d’installer le paquet rust : Cargo en fait partie. Pour accomplir cette tâche, nous pouvons utiliser le gestionnaire de paquets pacman :
sudo pacman -Sy rustInstallation de htmlq
Une fois Cargo installé, nous pouvons l’utiliser pour installer l’outil htmlq. Nous n’avons pas besoin de privilèges administratifs pour effectuer l’opération, car nous installerons le logiciel uniquement pour notre utilisateur. Pour installer htmlq, nous exécutons :
cargo install htmlqLes binaires installés avec cargo sont placés dans le répertoire ~/.cargo/bin, donc, pour pouvoir invoquer l’outil à partir de la ligne de commande sans avoir à spécifier son correctif complet à chaque fois, nous devons ajouter le répertoire à notre PATH. Dans notre fichier ~/.bash_profile ou ~/.profile, nous ajoutons la ligne suivante :
export PATH="${PATH}:${HOME}/.cargo/bin"Pour que la modification soit effective, nous devons nous déconnecter et nous reconnecter, ou comme solution temporaire, il suffit de ré-sourcer le fichier :
source ~/.bash_profileÀ ce stade, nous devrions être en mesure d’invoquer htmlq depuis notre terminal. Voyons quelques exemples de son utilisation.
Exemples d’utilisation de Htmlq
La façon la plus courante d’utiliser htmlq est de lui passer la sortie d’une autre application très couramment utilisée : curl. Pour ceux d’entre vous qui ne le savent pas, curl est un outil utilisé pour transférer des données depuis ou vers un serveur. En l’exécutant sur une page Web, il renvoie cette source de page à la sortie standard ; Tout ce que nous avons à faire est de le rediriger vers htmlQ. Voyons quelques exemples.
Extraction d’une balise spécifique
Supposons que nous voulions extraire tous les liens contenus dans la page d’accueil du site Web « The New York Times ». Nous savons que les liens HTML sont créés à l’aide de la balise a, donc la commande que nous exécuterions est la suivante :
curl --silent https://www.nytimes.com | htmlq aDans l’exemple ci-dessus, nous avons invoqué curl avec l’option --silent : cela permet d’éviter que l’application n’affiche la progression du téléchargement de la page ou d’autres messages dont nous n’avons pas besoin dans ce cas. Avec l’opérateur | pipe, nous avons utilisé la sortie produite par curl comme entrée htmlq. Nous avons appelé ce dernier en passant le nom de la balise que nous recherchons comme argument. Voici le résultat (tronqué) de la commande :
[...]
<a class="css-1wjnrbv" href="/section/world">World</a>
<a class="css-1wjnrbv" href="/section/us">U.S.</a>
<a class="css-1wjnrbv" href="/section/politics">Politics</a>
<a class="css-1wjnrbv" href="/section/nyregion">N.Y.</a>
<a class="css-1wjnrbv" href="/section/business">Business</a>
<a class="css-1wjnrbv" href="/section/opinion">Opinion</a>
<a class="css-1wjnrbv" href="/section/technology">Tech</a>
<a class="css-1wjnrbv" href="/section/science">Science</a>
<a class="css-1wjnrbv" href="/section/health">Health</a>
<a class="css-1wjnrbv" href="/section/sports">Sports</a>
<a class="css-1wjnrbv" href="/section/arts">Arts</a>
<a class="css-1wjnrbv" href="/section/books">Books</a>
<a class="css-1wjnrbv" href="/section/style">Style</a>
<a class="css-1wjnrbv" href="/section/food">Food</a>
<a class="css-1wjnrbv" href="/section/travel">Travel</a>
<a class="css-1wjnrbv" href="/section/magazine">Magazine</a>
<a class="css-1wjnrbv" href="/section/t-magazine">T Magazine</a>
<a class="css-1wjnrbv" href="/section/realestate">Real Estate</a>
[...]
Nous avons tronqué la sortie ci-dessus pour plus de commodité, cependant, nous pouvons voir que l’intégralité des balises <a> a été renvoyée. Que se passe-t-il si nous voulons obtenir uniquement la valeur de l’un des attributs de la balise ? Dans de tels cas, nous pouvons simplement invoquer htmlq avec l’option --attribute et passer l’attribut dont nous voulons récupérer la valeur en argument. Supposons, par exemple, que nous voulions uniquement obtenir la valeur de l’attribut href, qui est l’URL réelle de la page à laquelle les liens sont envoyés. Voici ce que nous allions exécuter :
curl --silent https://www.nytimes.com | htmlq a --attribute hrefVoici le résultat que nous obtiendrions :
[...]
/section/world
/section/us
/section/politics
/section/nyregion
/section/business
/section/opinion
/section/technology
/section/science
/section/health
/section/sports
/section/arts
/section/books
/section/style
/section/food
/section/travel
/section/magazine
/section/t-magazine
/section/realestate
[...]
Obtenir les URL complètes des liens
Comme vous pouvez le voir, les liens sont renvoyés tels qu’ils apparaissent dans la page. Ce qui leur manque, c’est l’URL « de base », qui dans ce cas est https://www.nytimes.com. Existe-t-il un moyen de l’ajouter à la volée ? La réponse est oui. Ce que nous devons faire, c’est utiliser l’option -b (abréviation de --base) de htmlq, et passer l’URL de base que nous voulons comme argument :
curl --silent https://www.nytimes.com | htmlq a --attribute href -b https://www.nytimes.comLa commande ci-dessus renverrait ce qui suit :
[...]
https://www.nytimes.com/section/world
https://www.nytimes.com/section/us
https://www.nytimes.com/section/politics
https://www.nytimes.com/section/nyregion
https://www.nytimes.com/section/business
https://www.nytimes.com/section/opinion
https://www.nytimes.com/section/technology
https://www.nytimes.com/section/science
https://www.nytimes.com/section/health
https://www.nytimes.com/section/sports
https://www.nytimes.com/section/arts
https://www.nytimes.com/section/books
https://www.nytimes.com/section/style
https://www.nytimes.com/section/food
https://www.nytimes.com/section/travel
https://www.nytimes.com/section/magazine
https://www.nytimes.com/section/t-magazine
https://www.nytimes.com/section/realestate
[...]
Obtention du texte entre les balises
Que se passe-t-il si nous voulons « extraire » le texte contenu entre des balises spécifiques ? Supposons par exemple que nous voulions obtenir uniquement le texte utilisé pour les liens existants dans la page ? Tout ce que nous avons à faire est d’utiliser l’option -t (--text) de htmlq :
curl --silent https://www.nytimes.com | htmlq a --textVoici le résultat renvoyé par la commande ci-dessus :
[...]
World
U.S.
Politics
N.Y.
Business
Opinion
Tech
Science
Health
Sports
Arts
Books
Style
Food
Travel
Magazine
T Magazine
Real Estate
[...]
Utilisation des sélecteurs css
Lorsque nous utilisons htmlq, nous ne sommes pas limités à simplement passer le nom de la balise que nous voulons récupérer en argument, mais nous pouvons utiliser des sélecteurs css plus complexes. En voici un exemple. De tous les liens existants dans la page que nous avons utilisée dans l’exemple ci-dessus, supposons que nous voulions récupérer uniquement ceux avec la classe css-jq1cx6. Nous courrions :
curl --silent https://www.nytimes.com | htmlq a.css-jq1cx6De même, pour filtrer toutes les balises où l’attribut data-testid existe et qui ont la valeur « footer-link », nous exécuterions :
curl --silent https://www.nytimes.com | htmlq a[data-testid="footer-link"]Conclusions
Dans ce tutoriel, nous avons appris à utiliser l’application htmlq pour effectuer le scraping de pages web à partir de la ligne de commande. L’outil est écrit en Rust, nous avons donc vu comment l’installer à l’aide du gestionnaire de paquets « Cargo », et comment ajouter le répertoire par défaut que Cargo utilise pour stocker les binaires à notre PATH. Nous avons appris à récupérer des balises spécifiques à partir d’une page, à obtenir la valeur d’un attribut de balise spécifique, à passer une URL de base à ajouter à des liens partiels, à utiliser des sélecteurs css et, enfin, à récupérer du texte entre les balises.
