Extraire l'info du Web en ligne de commande đ«đ·
Avant mĂȘme de coder un lecteur RSS et de lâutiliser toute la journĂ©e, je cherchais un moyen efficace de connaĂźtre lâheure et le mouvement de la marĂ©e, et un flux RSS semblait une bonne idĂ©e.

Il me semble mĂȘme (pas vraiment sĂ»r) me souvenir dâune telle ressource, mais si elle a jamais existĂ©, elle est tombĂ©e maintenant de toute façon ; et pour cause : il nâest pas une mince affaire de servir potentiellement des centilliards de flux RSS, un par plage / port / cĂŽte.
Donc jâutilisais des sites Web. Trouver le navigateur, se tromper dâURL, ce genre de choses, mais je veux dire on est des programmeurs, on ne fait rien trois fois avant dâĂ©crire un script pour le faire Ă notre place.
Le truc est que le âgrattageâ (scraping) Web est gĂ©nĂ©ralement le cheval de bataille des grands frameworks, jâen sais quelque chose, Ă©tant lâauteur de Feedrat et Favrat, qui chassent, trouvent et signalent respectivement les flux RSS et les favicons dans les pages Web, mais avec Nodejs et une montagne de dĂ©pendances.
RĂ©cemment, jâai remarquĂ© que jâutilisais le mĂȘme site depuis des mois, et quâil Ă©tait vraiment stable. Jâai donc dĂ©cidĂ© de rechercher âweb scraping from the shellâ et jâai trouvĂ© hxnormalize et hxselect ; Ces deux commandes sont disponibles dans le paquet html-xml-utils
.
Avec ces deux commandes, nous pouvons
- Lire du HTML (concrĂštement, disposer dâun objet reprĂ©sentant le DOM de la page, et non plus dâune simple chaine de caractĂšres.)
- SĂ©lectionner nâimporte quel Ă©lĂ©ment dans ce DOM
Nous nâavons donc besoin que dâun vĂ©hicule, dâun vaisseau pour nous transmettre la page Web, et avec ces deux commandes, faire quelque chose dâintĂ©ressant / valable / utile. Ce vaisseau est wget
. Ou curl
. Allez, wget
, câest celui que je connais le mieux.
1 | apt install html-xml-utils lynx wget |
Oui, on va avoir besoin de lynx
plus tard, mais de toute façon tu devrais avoir ces commandes installées sur toutes tes machines tout le temps, allons donc.
Voici le site Web que je consulte pour obtenir les prochaines heures de marĂ©e de nâimporte quel endroit de la terre :
Ou juste F12
Mais nous, on veut ces donnĂ©es disponibles directement sur le bureau, comment faire ça juste avec un bĂšte script shell ? Clic droit sur lâĂ©lĂ©ment, sĂ©lectionner âInspecterâ ; En visant bien, on obtiend le rĂ©sultat de lâimage ci-dessus.
Note le nom (en fait le type et la classe) de lâĂ©lĂ©ment, dans notre cas p.lead
et nous voilĂ en chemin đ
Tous au clavier
Testons ça : entre la commande suivante dans la console - zsh
et bash
fonctionnent tous les deux - tu as installé wget
, hm ?
1 | echo "https://www.cabaigne.net/france/bretagne/saint-quay-portrieux/horaire-marees.html" | wget -O- -i- | hxnormalize -x | hxselect -i "p.lead" |
Et voici la sortie
1 | --2022-10-13 20:03:06-- https://www.cabaigne.net/france/bretagne/saint-quay-portrieux/horaire-marees.html |
Bingo ! Dans cette petite chaßne se trouvent les 2 infos dont nous avons besoin :
- LâĂ©tat actuel de la marĂ©e (dans notre cas âhauteâ (high))
- La date/heure de la prochaine marée
Il ne reste plus quâĂ se dĂ©barrasser du formatage HTML, ce que seul un dĂ©butant entreprendrait : lâanalyse HTML (ou nâimporte quel langage de balisage dâailleurs) est une douleur dont la mĂ©moire ne disparait jamais vraiment, demande Ă nâimporte quelle pauvre Ăąme ayant dĂ©jĂ essayĂ©.
Non, ce que nous allons faire est de juste demander poliment Ă Lynx (lynx
est installé) dont le travail est de faire pile cela (analyser du HTML) de nous sortir une chaßne propre et non formatée :
1 | echo "https://www.cabaigne.net/france/bretagne/saint-quay-portrieux/horaire-marees.html" | wget -O- -i- | hxnormalize -x | hxselect -i "p.lead" | lynx -stdin -dump |
Sortie
1 | FINISHED --2022-10-13 20:10:15-- |
Oh, flute, il y a une balise sur notre chemin. Regarde Ă nouveau lâimage ci-dessus. Saperlipopette, ce $*=)! de
1 | <img src="/site/images/temps.png"> |
Est physiquement dans le div
mĂȘme, pas moyen dâĂ©viter ça. On va juste lâextraire de la chaĂźne reçue en utilisant ce bon vieux sed
1 | echo "https://www.cabaigne.net/france/bretagne/saint-quay-portrieux/horaire-marees.html" | wget -O- -i- | hxnormalize -x | hxselect -i "p.lead" | lynx -stdin -dump | sed '1d' |
Sortie
1 | FINISHED --2022-10-13 20:20:26-- |
Tous Ă la plage đ
Voici le script que jâai Ă©crit pour obtenir lâheure et le mouvement de la prochaine marĂ©e directement dans ma barre i3status, accessible en un clin dâĆil ; Passer simplement lâurl en premier argument.
1 | !/usr/bin/env bash |
Dans i3
1 | set $next_tide_script ~/.scripts/px-i3-next-tide-time.sh [url] |
Ă ce stade, le script sâexĂ©cutera Ă chaque dĂ©marrage ou redĂ©marrage dâi3 ; Si - comme moi - tu veux quâil sâexĂ©cute toutes les heures quoi quâil arrive, utilise ça (avec ton propre ${MYSCRIPTDIR}
bien sur)
1 | (crontab -l 2>/dev/null; echo "0 * * * * ${MYSCRIPTDIR}/px-i3-next-tide-time.sh") | crontab - |
Oui, câest une entrĂ©e crontab directement depuis le shell, sans avoir Ă utiliser visudo
ou autre non-sens, oui je sais que tu lâas lu ici en premier, merci beaucoup.
1 | order += "read_file next_tide_time" |
Câest tout, Ă la prochaine fois, restons rĂ©els. Oh, et attention aux oursins đ