Δυστυχως, αυτο που φοβουνται οι περισσοτεροι, οταν ξεκιναν να ασχολουνται με το Unix/Linux/Ubuntu, ειναι και το πιο δυνατο ατου που εχει… αναφερομαι στο τερματικο. Ειναι δυσκολο, αλλα αν το μαθεις, σου λυνονται τα χερια. Μπορεις να κανεις "περιεργα/τρελα" πραγματα, που δεν τα κανεις ουτε με το καλυτερο γραφικο περιβαλλον. Σε αυτο το tutorial, θα δουμε πως μπορουμε να εξαγουμε στοιχεια απο ιστοσελιδες που μας ενδιαφερουν. Μπορειτε πχ να εξαγετε τον καιρο μιας τοποθεσιας και να σωζετε τις πληροφοριες αυτες σε ενα αρχειο ή να τις εμφανιζετε στο desktop σας… μπορειτε να παρακολουθειτε μετοχες, top ten λιστες απο διαφορα sites και θεματα… και οτι αλλο σκεφτειτε.
Εδω, για λογους συντομιας και απλοτητας, θα φτιαξουμε ενα script το οποιο θα περνει απο μια ιστοσελιδα πληροφοριες για το ζωδιο μας. Η λογικη ειναι πανω-κατω ιδια και για αλλες περιπτωσεις, οποτε αν το θεμα σας φενεται αστειο, μην σταματησετε να διαβαζετε.
Καταρχας βρισκουμε την ιστοσελιδα που ενδιαφερει και ανοιγουμε να δουμε τον πηγαιο κωδικα της (source code). Aυτο στο firefox γινεται, πατωντας Control + U. Aφου ανοιξει το παραθυρο με τον κωδικα, τον κοιταμε προσεκτικα και ψαχνουμε να βρουμε καποιο κομματι κειμενου ή κωδικα που ειναι μοναδικο στην ιστοσελιδα και ειναι ακριβως διπλα στο κειμενο που θελουμε να εξαγουμε. Θελουμε δηλαδη να βρουμε κατι χαρακτηριστικο που να δηλωνει που ειναι το κειμενο που ψαχνουμε. Η ιστοσελιδα που θα παρουμε τα στοιχεια μας ειναι η: http://www.psychicguild.com/Daily-Horoscope/Scorpio. Ανοιξτε τον κωδικα της και θα δειτε οτι διπλα στις πληροφοριες που θελουμε να παρουμε, εχει ενα ξεχωριστο κομματι κωδικα που ειναι μοναδικος σε ολη την σελιδα: <div id="now2" style="">
Οποτε, καταρχας πρεπει να αποθηκευσουμε την σελιδα, τοπικα, στον υπολογιστη μας. Αυτο το κανουμε δινοντας την εντολη wget
ετσι:
wget -O scorpio.txt http://www.psychicguild.com/Daily-Horoscope/Scorpio
Οπου scorpio.txt το ονομα του αρχειου που θελουμε να αποθηκευσουμε την σελιδα και μετα βαζουμε και την διευθυνση της ιστοσελιδας. Περιμενουμε και βλεπουμε οτι ο υπολογιστης σωζει την συγκεκριμενη ιστοσελιδα.
Για να εξαγουμε το κομματι με τις πληροφοριες, χρησιμοποιουμε την εντολη grep
. Με την εντολη αυτη βρισκουμε ενα κομματι κειμενου μεσα σε ενα αρχειο. Οποτε για να εξαγουμε τις πληροφοριες μας δινουμε:
grep '<div id="now2" style="">' scorpio.txt
Αυτο θα μας τυπωσει ολη την σειρα κειμενου, μαζι με τον κωδικα HTML. Εμεις ομως θελουμε μονο το κειμενο, χωρις τον κωδικα HTML. Oποτε πρεπει να τον αφαιρεσουμε. Για να γινει αυτο, χρησιμοποιουμε την εντολη sed. H εντολη sed, αντικαθιστα ενα κομματι κειμενου, με ενα αλλο που θελουμε. Εμεις εδω θελουμε να αφαιρεσουμε τα HTML codes, τα οποια ολα, ξεκινανε και τελειωνουν με τους χαρακτηρες < και >. Ετσι θα χρησιμοποιησουμε την εντολη sed με ενα regular expression, το οποιο βρισκει τα HTML tags και θα τα αφαιρεσουμε. Δινουμε λοιπον την παρακατω εντολη:
sed -e 's/<[a-zA-Z\/][^>]*>//g' scorpio.txt
Στην οθονη θα μας τυπωθει το κειμενο της ιστοσελιδας χωρις τα HTML tags. Αλλα… μας τυπωνει ολη την ιστοσελιδα…και οχι μονο το κομματι που θελουμε. Αυτο γινετε γιατι με την προηγουμενη εντολη (την grep) παρολο που μας τυπωσε στην οθονη το κειμενο που θελαμε, στο αρχειο scorpio.txt δεν εγινε καμμια μεταβολη. Δεν σωσαμε τιποτα, απλα το εμφανισαμε στην οθονη μας. Πως λοιπον τωρα με την εντολη sed θα αντικαταστισουμε τα HTML tags μονο στο κομματι που θελουμε;;; Θα χρησιμοποιησουμε pipes! Tο pipe ειναι, ας πουμε, μια εντολη η οποια περνει την εξοδο μιας εντολης (το κειμενο που εμφανιζει δηλαδη) και το στελνει ως εισαγωγη στην επομενη εντολη.
Για να αντικαταστησουμε τα HTML tags μονο στο κομματι του αρχειου που θελουμε δινουμε την παρακατω εντολη:
grep '<div id="now2" style="">' scorpio.txt | sed -e 's/<[a-zA-Z\/][^>]*>//g'
Τι κανουμε… πρωτα βρισκουμε το σημειο του κειμενου με την εντολη grep και μετα με το pipe (ο χαρακτηρας | ) περναμε την εξοδο της grep
σαν εισοδο στην sed
. Eτσι τωρα η sed δεν χρειαζετε να τις πουμε το ονομα του αρχειου οπως πριν (sed -e 's/<[a-zA-Z\/][^>]*>//g' scorpio.txt
). Ετσι μας δινετε τωρα σαν εξοδο, το κομματι κειμενου που θελουμε, χωρις τα HTML tags.
Oμως, δεν τελειωσαμε. Αν παρατηρησετε, στο κειμενο εμφανιζονται και κατι ειδικοι χαρακτηρες και πολλα κενα (’,– κτλ). Δεν ειναι ωραια να τα βλεπουμε… οποτε θα τα αφαιρεσουμε και παλι με την εντολη sed. Oποτε δινουμε:
grep '<div id="now2" style="">' scorpio.txt | sed -e 's/<[a-zA-Z\/][^>]*>//g' | sed -e 's/’//g' | sed -e 's/–//g'
Oπως βλεπετε, συνεχιζουμε και προσθετουμε pipes, μεχρι να φτασουμε το τελικο κειμενο στην μορφη που θελουμε. Ενα τελευταιο βημα που θα κανουμε, ειναι να αφαιρεσουμε το κενο που εχει στην αρχη το κειμενο μας, το οποιο ειναι απλα tabs. Aυτο γινετε με την εντολη sed ‘s/[\t]//g’ οποτε η τελικη μας εντολη θα γινει ετσι:
grep '<div id="now2" style="">' scorpio.txt | sed -e 's/<[a-zA-Z\/][^>]*>//g' | sed -e 's/’//g' | sed -e 's/–//g' | sed 's/[\t]//g'
Αν θελουμε να το σωσουμε σε ενα αρχειο, θα δωσουμε την παραπανω εντολη προσθετωντας το συμβολο > με το ονομα του αρχειου που θελουμε να σωθει καπως ετσι:
grep '<div id="now2" style="">' scorpio.txt | sed -e 's/<[a-zA-Z\/][^>]*>//g' | sed -e 's/’//g' | sed -e 's/–//g' > scorpios.txt
Αν θελουμε να το κανουμε ολο αυτο, ενα script θα γινει ετσι:
#!/bin/sh
wget -O scorpio.txt http://www.psychicguild.com/Daily-Horoscope/Scorpio
grep '<div id="now2" style="">' scorpio.txt | sed -e 's/<[a-zA-Z\/][^>]*>//g' | sed -e 's/’//g' | sed -e 's/–//g' > scorpios.txt
H βασικη αρχη και σκεψη ειναι ιδια παντου. Καθε ιστοσελιδα εχει διαφορετικη δομη, οποτε πρεπει να αλλαξετε τις εντολες αναλογα. Τα βασικα εργαλεια ειναι οι εντολες wget, sed και grep. Αλλα δεν ειναι μονο αυτες. Οσο ψαχνετε τις εντολες του τερματικου, τοσο θα τελειοποιητε τον κωδικα σας και τις ικανοτητες σας. Μπορειτε να βρειτε scripts απο το Internet και να διαβασετε τον κωδικα τους για να δειτε και αλλα παραδειγματα.