Śledząc BBC News przy pomocy przeglądarki
Napisał: Patryk Krawaczyński
19/08/2009 w Hacks & Scripts Brak komentarzy. (artykuł nr 131, ilość słów: 1052)
P
rzedstawiony skrypt jest tłumaczeniem “Tracking BBC News with lynx” z książki “Wicked Cool Shell Scripts” autorstwa Dave’a Taylor’a udostępnionym on-line (Skrypt #60) na stronie www.intuitive.com. Do tłumaczenia zostało dodane także parę informacji od tłumacza.
Jak już pewnie wspomniałem – jednym z cichych bohaterów Internetu w formie linii poleceń jest niewątpliwie przeglądarka internetowa lynx (albo jej nowszy brat links). Pomimo, że możemy używać jej by surfować po sieci – jeśli nie lubisz grafiki, do jej prawdziwej potęgi i władzy możemy się przekonać w samej linii poleceń oraz skrypcie.
Dla przykładu flaga -dump przedstawia tekst bez źródła kodu HTML, jak pokazano poniżej podczas odwiedzin strony serwisu BBC World Service, która śledzi technologiczne nowości:
$ url=http://news.bbc.co.uk/2/low/technology/default.stm $ lynx -dump $url | head [1]Skip to main content BBC NEWS / TECHNOLOGY [2]Graphics version | [3]Change to UK Edition | [4]BBC Sport Home _________________________________________________________________ [5]News Front Page | [6]Africa | [7]Americas | [8]Asia-Pacific | [9]Europe | [10]Middle East | [11]South Asia | [12]UK | [13]Business | [14]Health | [15]Science/Nature | [16]Technology | [17]Entertainment | [18]Have Your Say
Ten format wyjściowy nie jest zbyt interesujący, ale z łatwością pasuje do polecenia grep lub innego narzędzia uruchamianego z linii poleceń, ponieważ w tym momencie jest to właśnie strumień tekstu. Teraz możemy bardzo łatwo sprawdzić stronę by zobaczyć czy znajdują się na niej jakiekolwiek artykuły na interesujący nas temat np. firmy komputerowe lub grupy ludzi. Zobaczmy czy są jakieś nowości dotyczące gier – wyświetlając jednowierszowy kontekst dookoła każdego pasującego wyniku przy pomocy grep:
$ lynx -dump $url | grep -C1 -i games [21]Screenshot from Vice City [22]Britons' love affair with games Britain is turning into a nation of keen gamers, research by the UK games industry trade body suggests. -- line-up Many of the Nintendo games for the Christmas run-up return to familiar characters and brand names. Web and Internet Users 173 -- Virtual pets fed by photos and pronunciation puzzles are just some of the mobile phone games popular in Japan. [28]Next gen consoles spark concern The next generation of consoles could shake up the games industry, with smaller firms going bust, say experts. -- [37]Text msgs play games with TV Your TV and mobile are coming closer together, with game shows played -- [38]Mobile gaming 'set to explode' Consumers will be spending millions of pounds to play games on their mobiles by next year, say experts.
Liczby w kwadratowych nawiasach to odnośniki URL, wyświetlone dalej w formacie wyjściowym, tak więc by zidentyfikować odsyłacz [37], strona musi być ponownie zażądana, ale tym razem grep znajdzie skojarzony odsyłacz URL:
$ lynx -dump $url | grep '37\.' 37. http://news.bbc.co.uk/2/low/technology/3182641.stm
Zamieniając flagę -dump na -source spowodujemy, że format wyjściowy przeglądarki lynx stanie się bardziej interesujący.
$ lynx -source $url | grep -i 'PublicationDate' <meta name="OriginalPublicationDate" content="2003/08/29 15:01:14" />
Flaga -source ukazuje kod źródłowy HTML podanej strony. Potokujemy to źródło jeden lub dwa razy do narzędzia grep i możemy w ten sposób wyodrębnić dowolną informację ze strony internetowej, nawet informację opatrzoną w znacznik lub znak komentarza. Skrypt “bbcnews” pozwala łatwo wyskrobać najważniejsze nowinki z zakresu techniki, o każdej porze:
Kod:
#!/bin/sh # bbcnews - najważniejsze informacje z serwisu BBC World url="http://news.bbc.co.uk/2/low/technology/default.stm" lynx -source $url | \ sed -n '/Last Updated:/,/newssearch.bbc.co.uk/p' | \ sed 's/</\ </g;s/>/>\ /g' | \ grep -v -E '(<|>)' | \ fmt | \ uniq
Jak to działa:
Pomimo, że jest to krótki skrypt, to jest on bardzo gęsto upakowany. Skrypty takie najlepiej są zbudowane iteracyjnie, szukając wzorów do przefiltrowania w strukturze informacji strony internetowej, następnie dostosować je wiersz po wierszu uzyskując interesujący nas format wyjściowy. Na stronie BBC proces ten jest bardzo prosty, ponieważ strona ta już jest wersją niskiej szerokości pasma. Pierwszym zadaniem jest odrzucenie całego kodu HTML, który jest związany z głównym menu nawigacyjnym, odsyłaczami wewnętrznymi, itd., tak aby pozostało tylko sedno treści strony, czyli artykuły same w sobie. To właśnie robi pierwsze polecenie sed – redukuje strumień danych, zachowując tylko nagłówek oraz treść nowych artykułów pomiędzy ciągiem “Last Updated” na górze strony, a boksem wyszukiwarki newssearch.bbc.co.uk/p na dole strony. Następna inwokacja polecenia sed jest brzydsza niż pierwsza, ponieważ po prostu robi ona coś specyficznego:
sed 's/</\ </g;s/>/>\ /g'
Funkcja ta za każdym razem kiedy znajdzie ostry, lewy nawias otwierający (<), zamienia go na znak powrotu karetki, za którym następuje lewy nawias ostry. Prawy, ostry nawias zamykający (>) jest zastępowany znakiem zamykającym, za którym następuje znak powrotu karetki. Gdyby polecenie sed posiadało obsługę notacji /n do określania znaków powrotu karetki, drugie wywołanie funkcji z sed nie musiałoby być napisane poprzez trzy linie oraz byłoby bardziej czytelne:
sed 's/</\n</g;s/>/>\n/g'
Podczas, gdy dodane znaki powrotu karetki ustawiają wszystkie znaczniki HTML w ich własnych wierszach, drugie wywołanie narzędzie grep wyodrębnia wszystkie te znaczniki (-v odwraca logikę polecenia grep, pokazując wszystkie linie, które nie pasują do wzoru, a flaga -E mówi, że argument polecenia jest złożonym wyrażeniem regularnym), oraz wynik jest wprowadzany do fmt, by lepiej zawinąć wynikowe linie tekstowe. Ostatecznie polecenie uniq jest użyte by zapewnić, że w danych wyjściowych nie będzie wielu pustych wierszy: usuwa wszystkie nieunikatowe linie ze strumienia danych.
Uruchamianie skryptu:
Skrypt nie posiada żadnych argumentów – dopóki serwis BBC nie zmieni swojego podstawowego układu i źródła strony oraz będzie generował tekstowe wersje nagłówków, które są związane z najważniejszymi nowościami technologicznymi. Pierwsza wersja skryptu “bbcnews” była napisana na podstawie układu strony, który zmienił się latem 2003: serwis BBC pierwotnie miał wszystkie artykuły zawinięte w znaczniki <div>, ale to się zmieniło. Na szczęście prace nad aktualizacją skryptu trwały góra dziesięć minut.
Rezultaty:
Oto nowości technologiczne z końca sierpnia 2003 r.:
$ bbcnews | head -20 Last Updated: Friday, 29 August, 2003, 15:01 GMT 16:01 UK Youth suspected of net attack An American youth is suspected by the FBI of being one of the authors of the crippling MSBlast internet worm, say reports. Britons' love affair with games Britain is turning into a nation of keen gamers, research by the UK games industry trade body suggests. Familiar faces in Nintendo's line-up Many of the Nintendo games for the Christmas run-up return to familiar characters and brand names.
Modyfikowanie skryptu:
Z dokonaniem małego tuningu można spowodować, aby najważniejsze wiadomości z dziedziny technologii z serwisu BCC wyskakiwały za każdym
razem kiedy zalogujemy się na konto. Możemy także wysłać sobie wyniki skryptu na skrzynkę e-mail poprzez zadania programu crontab:
bbcnews | mail -s "BBC Technology News" peter
Nie należy jednak tych wiadomości wysyłać na listy mailowe lub newslettery, ponieważ istnieją kwestie związane z ochroną praw autorskich i własności intelektualnej, które zabraniają publikowania treści, która należy do innych osób. Istnieje cienka linia pomiędzy dozwolonym i niedozwolonym korzystaniem z praw autorskich, więc co do treści z innych serwisów należy podchodzić z dużą ostrożnością.
Więcej informacji: Script Shell, man lynx