Pup & scrape

Današnji zadatak je malo skrejpanja i automatizacije. Radimo dosadni posao u kojem moramo prebacivati podatke sa jednog sajta u dashboard drugoga i usput moramo skidati slike pa uploadati… Znači proces koji spor, naporan i dugotrajan.

SKREJPANJE

Recimo da želimo uzeti podatke od Konzum proizvoda. Pa ćemo prvo proučiti samu stranicu.

U terminalu upišemo:

wget -O t.html https://www.konzum.hr/web/products/abc-svjezi-krem-sir-200-g

i dobivamo HTML datoteku:

t.html

Prvo ćemo provjeriti možemo li doći do slike. Što znači, cilj nam je provjeriti da se naziv slike nalazi u html datoteci.

Sa F12 dobivamo developer tools i ime datoteke slike. U mom slučaju:

https://d17zv3ray5yxvp.cloudfront.net/variants/reAJQ7GVtNkfsDEWmWKkjQqi/57ed05bea98bceae5f0eaada26b69cee6c61471d3030f7123d212844a35eba04

Zatim otvaramo ‘t.html’ datoteku i jednostavno potražimo ime datoteke sa tekst editor ‘find’ alatom.

Ako postoji, super! Znači da sliku možemo povući sa ‘wget’ naredbom u terminalu:

wget https://d17zv3ray5yxvp.cloudfront.net/variants/reAJQ7GVtNkfsDEWmWKkjQqi/57ed05bea98bceae5f0eaada26b69cee6c61471d3030f7123d212844a35eba04

KAKO DO TEKSTA U HTML ELEMENTU?

Za to ćemo koristiti ‘Pup‘. Pup nam omogućava da izvlačimo tekst iz html datoteke preko selektora i sve u bash terminalu!

Pup instaliramo preko AUR-a sa trizenom:

trizen -S pup

Opet se vraćamo tekst editoru i tražimo klasu u kojoj se nalazi gore navedena slika.

Treba nam klasa: ‘.js-zoom’.

Sa naredbom:

cat t.html | pup '.js-zoom attr{data-lazy}' | head -n 1

Dobivamo link datoteke slike:

https://d17zv3ray5yxvp.cloudfront.net/variants/reAJQ7GVtNkfsDEWmWKkjQqi/57ed05bea98bceae5f0eaada26b69cee6c61471d3030f7123d212844a35eba04

FORMAT SLIKE

Što ako je slika PNG a nama treba JPG? Taj problem rješavamo sa ‘imagemagick’ paketom i ‘mogrify’ naredbom:

mogrify -format jpg 'našaSlikaSaKodom2143543312312'

To će nam prebaciti sliku u JPG. Bez obzira ako je slika već JPG.

NAZIV SLIKE

Budući da je naziv slike nekakav kod, kao novi naziv slike koristiti ćemo
naziv proizvoda ali problem je što ne možemo samo kopirati naziv proizvoda
u naziv artikla. Jer ne želimo da naziv bude npr. ‘Abc Classic Svježi krem sir 200 g.jpg’.
Pa ćemo pretvoriti naziv u slug.

Za to ćemo koristiti ‘python-slugify’ paket, pa ga instaliramo:

sudo pacman -S python-slugify

Nakon toga, testiramo slugify komandu:

slugify Abc Classic Svježi krem sir 200 g

Dobivamo:

abc-classic-svjezi-krem-sir-200-g

STRINGANJE

Trebamo naslov, opis i cijenu. Idemo opet nazad u ‘t.html’. To ćemo uzeti iz meta elemenata. Usput, mogli smo i sliku uzeti iz meta elementa ali slika u meta-i je manjeg formata.

cat t.html | pup '[property=og:title] attr{content}'
⏎ Abc Classic Svježi krem sir 200 g

cat t.html | pup '[property=product:price:amount] attr{content}' | sed 's/\./,/'
⏎ 11,49

cat t.html | pup '[property=og:description] attr{content}'
⏎ Abc svježi krem sir, min.65% mliječne masti u suhoj tvari.

ŠIFRA PROIZVODA (ID)

Trebat’ će nam neki ID da ga povežemo sa URL-om. Pa ćemo koristiti build-in Linux kernel UUID generator:

cat /proc/sys/kernel/random/uuid
⏎ b35e7dc7-8253-4100-ac67-b564154f7768

BASH UTILITY TEMPLATE

Za skiptu ćemo koristiti moj bash utility predložak koji izgleda ovako:

#!/bin/sh
UTIL_INFO="Some utility info"

if [ $# = 0 ]; then 
echo $UTIL_INFO

else 
echo $1
fi

Skripta “printa” UTIL_INFO varijablu ako nema argumenta naredbe odnosno, ako argumenta ima, starta se naredba sa argumentom.

SKRIPTA

Pravimo novi file:

touch konzum.sh
chmod +x konzum.sh
nano konzum.sh

Cijela skripta izgleda ovako:

#!/bin/sh
UTIL_INFO="Skida sliku i ispisuje podatke od konzum artikla."
if [ $# = 0 ]; then 
echo $UTIL_INFO
else 

[ ! -d "./pics" ] && mkdir ./pics
wget -O t.html $1 ; 
UUID=$(cat /proc/sys/kernel/random/uuid) ;
SLIKAURL=$(cat t.html | pup '.js-zoom attr{data-lazy}' | head -n 1) ;
OPIS=$(cat t.html | pup '[property=og:description] attr{content}') ;
NASLOV=$(cat t.html | pup '[property=og:title] attr{content}') ;
CIJENA=$(tail -n +5 t.html | pup '[property=product:price:amount] attr{content}' | sed 's/\./,/' ) ;

SLUG=$(slugify $NASLOV) ;
SLUGSLIKA="$SLUG"".jpg" ;

mogrify -format jpg "./pics/""$SLUGSLIKA"

echo "URL: "$1 ;
echo "NASLOV: "$NASLOV ;
echo "UUID: "$UUID ;
echo "OPIS: "$OPIS ;
echo "SLUG: "$SLUG ;
echo "CIJENA: "$CIJENA ;

fi

Skriptu pokrećemo sa URL argumentom konzum proizvoda:

./konzum.sh https://www.konzum.hr/web/products/dukat-maslac-250-g

Na kraju dobijemo sve podatke i pripremljenu sliku, spremnu za upload.

Odgovori

Vaša adresa e-pošte neće biti objavljena. Obavezna polja su označena sa * (obavezno)

Previous post Uvod u web components
Next post Kako poslati http request POST kao notify na pametni telefon?

🗣 You can translate this site using Chrome built-in translator.