Tips en Trucs 2021

Weerbericht van het internet schrapen

Als je in een project gegevens wilt opnemen van het internet, heb je verschillende mogelijkheden. De meest gebruikte methode is het ophalen van gegevens via een door de webpagina aangeboden API. Of je haalt de gegevens rechtstreeks van de webpagina. M.a.w. je laat software de website lezen en eruit halen wat je nodig hebt. Bij beide methoden moet je de verkregen gegevens verder verwerken om deze op een gepaste manier weer te geven. Veel websites doen dit echter al. Indien dit voor jouw project voldoende is, kan je ook een foto van de webpagina nemen, het betreffende gedeelte uitknippen en gebruiken. Dit gaan we vandaag doen om een weerbericht voor de volgende 48 uur weer te geven.

Foto nemen van webpagina

De meeste browsers zijn gebaseerd op Firefox of Chromium. Beiden hebben hun voor- en nadelen. Is het resultaat van de ene browser ontoereikend, gebruik dan de andere. Beide browsers kunnen zonder grafische omgeving een foto (screenshot) van een webpagina maken, dus ideaal om in een script te gebruiken.

Firefox

Firefox is in veel distributies standaard geïnstalleerd, ook in openSUSE Leap 15.2. Om met Firefox op de achtergrond een schermafdruk te maken en op te slaan in het bestand scrape.png, gebruik je de volgende opdracht:

dany@pindabook:~> firefox --screenshot scrape.png https://www.timeanddate.com/weather/belgium/bruges/hourly#bc --window-size=1300,1500
*** You are running in headless mode.

De gebruikte URL (https://www.timeanddate.com/weather/belgium/bruges/hourly#bc) probeer je eerst uit in een klassiek browservenster. De #bc zorgt dat de webpagina automatisch scrolt naar het element met het id bc. Dit kan iedereen die iets van HTML kent (waarmee een webpagina is opgebouwd) eenvoudig opsporen door zowel in Firefox als Chromium via de F12 toets het hulpprogramma voor het ontleden van webpagina's op te roepen. Met de optie --window-size=1300,1500 zorgen we dat de webpagina voldoende breed en hoog is om de benodigde informatie te kunnen weergeven.

Bij het belijken van de scrape.png afbeelding blijkt al vlug dat wat we nodig hebben op de foto ontbreekt. Deze keer slechte punten voor Firefox, volgende keer beter.

Chromium

In openSUSE Leap 15.2 moet je Chromium eerst met de volgende opdracht installeren:

dany@pindabook:~> sudo zypper install chromium
[sudo] wachtwoord voor root: 
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 9 NIEUWE pakketten zullen worden geïnstalleerd:
  chromium libavcodec58 libavformat58 libavutil56 libharfbuzz-subset0 libopenmpt0 librtmp1 libswresample3 libvo-amrwbenc0

9 nieuwe te installeren pakketten.
Totale downloadgrootte: 97,0 MiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 325,7 MiB worden gebruikt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
pakket libavutil56-4.2.1-pm152.2.6.1.x86_64 wordt opgehaald                           (1/9), 238,2 KiB (464,7 KiB uitgepakt)
Ophalen: libavutil56-4.2.1-pm152.2.6.1.x86_64.rpm ..................................................................[gereed]
pakket librtmp1-2.4.20151223.fa8646d-pm152.1.9.x86_64 wordt opgehaald                 (2/9),  65,7 KiB (133,1 KiB uitgepakt)
Ophalen: librtmp1-2.4.20151223.fa8646d-pm152.1.9.x86_64.rpm ........................................................[gereed]
pakket libvo-amrwbenc0-0.1.3-pm152.1.7.x86_64 wordt opgehaald                         (3/9),  71,2 KiB (128,2 KiB uitgepakt)
Ophalen: libvo-amrwbenc0-0.1.3-pm152.1.7.x86_64.rpm ................................................................[gereed]
pakket libswresample3-4.2.1-pm152.2.6.1.x86_64 wordt opgehaald                        (4/9), 101,4 KiB (131,8 KiB uitgepakt)
Ophalen: libswresample3-4.2.1-pm152.2.6.1.x86_64.rpm ...............................................................[gereed]
pakket libavcodec58-4.2.1-pm152.2.6.1.x86_64 wordt opgehaald                          (5/9),   4,2 MiB ( 11,6 MiB uitgepakt)
Ophalen: libavcodec58-4.2.1-pm152.2.6.1.x86_64.rpm .....................................................[gereed (4,0 MiB/s)]
pakket libharfbuzz-subset0-2.6.4-lp152.1.5.x86_64 wordt opgehaald                     (6/9), 211,3 KiB (474,4 KiB uitgepakt)
Ophalen: libharfbuzz-subset0-2.6.4-lp152.1.5.x86_64.rpm ............................................................[gereed]
pakket libopenmpt0-0.3.19-lp152.1.5.x86_64 wordt opgehaald                            (7/9), 549,9 KiB (  1,5 MiB uitgepakt)
Ophalen: libopenmpt0-0.3.19-lp152.1.5.x86_64.rpm ...................................................................[gereed]
pakket libavformat58-4.2.1-pm152.2.6.1.x86_64 wordt opgehaald                         (8/9), 930,9 KiB (  2,2 MiB uitgepakt)
Ophalen: libavformat58-4.2.1-pm152.2.6.1.x86_64.rpm ...................................................[gereed (15,6 KiB/s)]
pakket chromium-89.0.4389.114-lp152.2.83.1.x86_64 wordt opgehaald                     (9/9),  90,7 MiB (309,0 MiB uitgepakt)
Ophalen: chromium-89.0.4389.114-lp152.2.83.1.x86_64.rpm ................................................[gereed (3,6 MiB/s)]

Controleren op conflicten tussen bestanden: ........................................................................[gereed]
(1/9) Installeren van: libavutil56-4.2.1-pm152.2.6.1.x86_64 ........................................................[gereed]
(2/9) Installeren van: librtmp1-2.4.20151223.fa8646d-pm152.1.9.x86_64 ..............................................[gereed]
(3/9) Installeren van: libvo-amrwbenc0-0.1.3-pm152.1.7.x86_64 ......................................................[gereed]
(4/9) Installeren van: libswresample3-4.2.1-pm152.2.6.1.x86_64 .....................................................[gereed]
(5/9) Installeren van: libavcodec58-4.2.1-pm152.2.6.1.x86_64 .......................................................[gereed]
(6/9) Installeren van: libharfbuzz-subset0-2.6.4-lp152.1.5.x86_64 ..................................................[gereed]
(7/9) Installeren van: libopenmpt0-0.3.19-lp152.1.5.x86_64 .........................................................[gereed]
(8/9) Installeren van: libavformat58-4.2.1-pm152.2.6.1.x86_64 ......................................................[gereed]
(9/9) Installeren van: chromium-89.0.4389.114-lp152.2.83.1.x86_64 ..................................................[gereed]

Daarna kunnen we met de volgende opdracht een gelijkaardige schermafbeelding maken:

dany@pindabook:~> chromium --headless --hide-scrollbars --window-size=1300,1500 --disable-gpu --screenshot="scrape.png" "https://www.timeanddate.com/weather/belgium/bruges/hourly#bc"
[0416/181905.308244:WARNING:headless_browser_main_parts.cc(83)] Cannot create Pref Service with no user data dir.
failed to open /usr/lib64/dri/hybrid_drv_video.so
Not using hybrid_drv_video.so
[0416/181907.763729:INFO:headless_shell.cc(617)] Written to file scrape.png.

De opdracht is iets complexer. De --headless optie zorgt dat Chromium geen venster opent om de webpagina weer te geven. De --hide-scrollbars optie verbergt de schuifbalken. De --disable-gpu zorgt dat de webpagina niet met behulp van de grafische kaart wordt aangemaakt. Deze optie kan je weglaten, maar geeft soms foutmeldingen.

Deze keer krijgen we een bruikbare afbeelding.

Bruikbare gedeelte uitknippen

Met een afbeeldingenviewer (zoals Gwenview) of afbeeldingenbewerker (zoals GIMP) kan je vlug een uitsnede vastleggen. Daarbij heb je de positie van de linker bovenhoek en de breedte en hoogte van de uitsnede nodig.

Gwenview

Deze gegevens kunnen we nu gebruiken in een opdracht om het weerbericht uit de webpagina te knippen:

dany@pindabook:~> convert scrape.png -crop 975x397+93+361 weather.png

De afbeelding weather.png bevat nu het volgende weerbericht:
Weerbericht

Aanbieding in het PDF formaat

Sommige webpagina's bieden hun pagina ter beschikking in het PDF formaat (afdruk, print, enz.). Zo ook het weerbericht op de pagina van het Norwegian Meteorological Institute. Door de link te kopiëren, kan je dit PDF document met de volgende opdracht downloaden:

dany@pindabook:~> wget -O scrape.pdf https://www.yr.no/en/print/forecast/2-2800931/Belgium/Flanders/West%20Flanders/Bruges
--2021-04-16 20:03:37--  https://www.yr.no/en/print/forecast/2-2800931/Belgium/Flanders/West%20Flanders/Bruges
Herleiden van www.yr.no (www.yr.no)... 2a02:a000:1:213::51f3:133, 2a02:a000:1:213::51f3:131, 81.242.3.131, ...
Verbinding maken met www.yr.no (www.yr.no)|2a02:a000:1:213::51f3:133|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 380467 (372K) [application/pdf]
Wordt opgeslagen als: ‘scrape.pdf’

scrape.pdf                     100%[====================================================>] 371,55K  --.-KB/s    in 0,06s   

2021-04-16 20:03:37 (6,18 MB/s) - '‘scrape.pdf’' opgeslagen [380467/380467]

Daarna zetten we het PDF document met GhostScript om naar een PNG afbeelding:

dany@pindabook:~> gs -sDEVICE=pngalpha -dBATCH -dNOPAUSE -sOutputFile=scrape.png -r100 scrape.pdf
GPL Ghostscript 9.52 (2020-03-19)
Copyright (C) 2020 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
Processing pages 1 through 1.
Page 1

En kunnen we juist als daarstraks een uitsnede bepalen en met de volgende opdracht deze uitknippen:

dany@pindabook:~> convert scrape.png -crop 790x380+15+153 weatheryr.png

Deze keer krijgen we het volgende resultaat:
Weerbericht YR

Samen in een script

#!/bin/bash
# timeanddate
#firefox --screenshot scrape.png https://www.timeanddate.com/weather/belgium/bruges/hourly#currentAlert --window-size=1300,1500
chromium --headless --hide-scrollbars --window-size=1300,1500 --disable-gpu --screenshot="scrape.png" "https://www.timeanddate.com/weather/belgium/bruges/hourly#bc"
convert scrape.png -crop 975x397+93+361 weather.png

# yr.no
wget -O scrape.pdf https://www.yr.no/en/print/forecast/2-2800931/Belgium/Flanders/West%20Flanders/Bruges
gs -sDEVICE=pngalpha -dBATCH -dNOPAUSE -sOutputFile=scrape.png -r100 scrape.pdf
convert scrape.png -crop 790x380+15+153 weatheryr.png

Zo krijgen we simpel door dit script uit te voeren, twee afbeeldingen van weerberichten van dit moment. Klaar om gebruikt te worden in jouw eigen project. Zelf ben ik van plan dit op een Raspberry Pi te gebruiken om mijn domotica systeem met een weerbericht uit te breiden. Deze werkwijze heeft echter wel een nadeel, als de lay-out van de webpagina of het PDF document niet meer wordt aangeboden, moet je de zaak herbekijken. Maar dit probleem heb je ook als API's opeens anders gaan werken of helemaal niet meer worden aangeboden.

Opruimen

Chromium verwijder je volledig van het systeem met de opdracht:

dany@pindabook:~> sudo zypper remove -u chromium
[sudo] wachtwoord voor root: 
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 5 pakketten zullen worden VERWIJDERD:
  chromium libavformat58 libharfbuzz-subset0 libopenmpt0 librtmp1

5 te verwijderen pakketten.
Na de bewerking zal 313,3 MiB worden vrijgemaakt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
(1/5) Verwijderen van chromium-89.0.4389.114-lp152.2.83.1.x86_64 ...................................................[gereed]
(2/5) Verwijderen van libharfbuzz-subset0-2.6.4-lp152.1.5.x86_64 ...................................................[gereed]
(3/5) Verwijderen van libavformat58-4.2.1-pm152.2.6.1.x86_64 .......................................................[gereed]
(4/5) Verwijderen van librtmp1-2.4.20151223.fa8646d-pm152.1.9.x86_64 ...............................................[gereed]
(5/5) Verwijderen van libopenmpt0-0.3.19-lp152.1.5.x86_64 ..........................................................[gereed]

De aangemaakte bestanden kan je verwijderen met een rm opdracht:

dany@pindabook:~> rm scrape.png scrape.pdf weather.png weatheryr.png weather.sh