[bash] Przetwarzanie informacji ze strony internetowej - lista satelitów w conky

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
dorsai
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 01 gru 2007, 12:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

[bash] Przetwarzanie informacji ze strony internetowej - lista satelitów w conky

Post autor: dorsai »

Witam!

Chciałbym sobie zrobić gadżet do Conky, wyświetlający mi satelity widoczne na niebie danego dnia. Wszystkie informacje są na stronie:
http://www.heavens-above.com/allsats.as ... 103&tz=CET

zatem problem sprowadza się do zparsowania tego pliku. Próbowałem coś tam dłubać, lecz przyznam szczerze, 2,5 miesiąca na linuksie nie pozwoliło mi nabyć wystarczającej biegłości :D W PHP może bym to napisał, ale z bashem jest problem.
W sumie problem sprowadza się do:

- odnalezienia początkowej linii tabeli - tutaj próbowałem

Kod: Zaznacz cały

wget --timeout=3 -t 1 -q -O - 'http://www.heavens-above.com/allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET' | grep -n 'Satellite'
lecz jak wyciągnąć z tego sam numer linii, a nie całą linię poprzedzoną numerem?

- odnalezienia końcowej linii tabeli - j.w. tylko

Kod: Zaznacz cały

wget --timeout=3 -t 1 -q -O - 'http://www.heavens-above.com/allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET' | grep -n '</table><p>'
-Wczytania wszystkiego co pomiędzy z usunięciem tagów HTML. Wiem, że pobrać konkretną linię można z użyciem sed-a, więc reszta to pętelka i parsowanie

Chciałem by taki skrypcik uruchamiał się raz, przy uruchomieniu kompa (czyli wrzucić do autostartu, no problemo) by nie generować niepotrzebnie ruchu, wyniki zatem moglyby zostać zapisane do pliku tekstowego, z którego conky by korzystał
Pomożecie?

EDIT:
Edycja

Z częścią problemu już sobie poradziłem - wygrzebałem początkowy oraz końcowy numer linii:

Kod: Zaznacz cały

#!/bin/bash
strona='http://www.heavens-above.com/allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET'
plik='allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET'
wget $strona
start=$(cat $plik | grep -n 'Satellite')
stop=$(cat $plik | grep -n '</table><p>')
start=$(echo ${start%:*})
stop=$(echo ${stop%:*})
echo $start
echo $stop
rm $plik
Teraz kwestia powycinania wszystkiego, co znajduje się pomiędzy <> oraz usunięcie pustych linii i sformatowanie tekstu
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [bash] Przetwarzanie informacji tekstowych ze strony internetowej

Post autor: Struchu »

Hmmm, a może być w Perlu? Bo ja naskrobałem taki skrypcik:

Kod: Zaznacz cały

#!/usr/bin/perl -w

$pliktmp = "/tmp/sat.tmp";

system ("wget --timeout=3 -t 1 -q -O - 'http://www.heavens-above.com/allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET' -O $pliktmp");

open (SATS, "<$pliktmp") or die "Nie udalo sie otworzyc pliku $pliktmp: $!\n";
open (WYNIK, ">listasat") or die "Nie udalo sie otworzyc pliku listasat: $!\n";

my @tablica = <SATS>;

foreach $linia (@tablica)
{
    if ( $linia =~ /<td><a href="satinfo\.aspx.+?>(.+?)<\/a><\/td>/ )
    {
        print WYNIK "$1\n";
    }
}

close (WYNIK);
close (SATS);

unlink ("$pliktmp");
Generuje on do pliku "listasat" listę wszystkich satelit (jedna satelita - jedna linia).
Ma zielone, kocie oczy...
Awatar użytkownika
dorsai
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 01 gru 2007, 12:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [bash] Przetwarzanie informacji tekstowych ze strony internetowej

Post autor: dorsai »

Hmm, działa super, tylko, że nie chodziło o same nazwy satelitów. Trochę nieprecyzyjnie sformułowałem problem wcześniej.
Dobrze by było, by do tego doszły (w tej samej linii dla każdego satelity) informacje o:
czas start, azymut start
czas maks, azymut maks, elewacja maks (Alt.)
(stop można pominąć, zeby nie było za wiele w pojedynczej linii)

Mimo wszystko myślę, że prostsze będzie usunięcie wszystkich tagów html, potem usunięcie pustych linii i zapisanie do pliku wszystkiego jak leci, po kolei robiąc nową linię przed nazwą satelity... tylko jak?

Edycja:
W trochę łopatologiczny sposób wydobyłem to, co najistotniejsze, powinno działać.

Kod: Zaznacz cały

#!/bin/bash
strona='http://www.heavens-above.com/allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET'
plik='allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET'
wget $strona
start=$(cat $plik | grep -n 'Satellite')
stop=$(cat $plik | grep -n '</table><p>')
start=$(echo ${start%:*})
stop=$(echo ${stop%:*})
razem=$(cat $plik | head -n $stop | wc -l)
cat $plik | head -n $(($stop-2)) | tail -n $(( $razem - $start - 22)) > tmp.txt
razem=$(cat tmp.txt | wc -l)
razem=$(( $razem/27 ))
echo $razem
i=0
touch tmp2
while [ $i -lt $razem ]; do
	j=1	
	while [ $j -le 27 ]; do
		x=$(( 27*$i+$j ))
		op=$(echo "$x p" | tr -d ' ')
		case $j in
		"3") cat tmp.txt | sed -n $op >> tmp2 ;;
		"5") cat tmp.txt | sed -n $op >> tmp2 ;;
		"7") cat tmp.txt | sed -n $op >> tmp2 ;;
		"9") cat tmp.txt | sed -n $op >> tmp2 ;;
		"11") cat tmp.txt | sed -n $op >> tmp2 ;;
		"13") cat tmp.txt | sed -n $op >> tmp2 ;;
		"15") cat tmp.txt | sed -n $op >> tmp2 ;;
		"17") cat tmp.txt | sed -n $op >> tmp2 ;;
		"19") cat tmp.txt | sed -n $op >> tmp2 ;;
		*) ;;
		esac
		j=$(( $j+1 ))
		done
	i=$(( $i+1 ))
done
rm tmp.txt
rm $plik
Tylko jak teraz pozbyć się znaczników HTML? Próbowałem polecenia tr -d '<td>' ale to niestety usuwa wszystkie znaki, jakie sie tam znalazły (czyli wszystkie "<", wszystkie "t" wszystkie "d" oraz wszystkie ">"). Jak usunąć konkretny ciąg znaków?
yantar
Sędziwy Jeż
Sędziwy Jeż
Posty: 40
Rejestracja: 11 kwie 2007, 17:47
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce

Odp: [bash] Przetwarzanie informacji tekstowych ze strony internetowej

Post autor: yantar »

Moze sprobuj zamiast uzywac wget i sciagac plik html, uzyj jak w przypadku skryptu pogodynki do conky przegladarki w3m z opcja -dump zrzucisz sam tekst do pliku w locie wykonujac parsowanie. Ja tak robie z informacja pogodowa ze stacji metereologicznej, ktora mam kolo siebie. Z tym powino byc jeszcze prosciej bo wszystko ladnie w tabelce siedzi.


aga28-proszę używać polskich znaków!
"Internet bez Opery to chaos"
Awatar użytkownika
dorsai
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 01 gru 2007, 12:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [Rozwiązany][bash] Przetwarzanie informacji tekstowych ze strony internetowej

Post autor: dorsai »

mości yantarze to genialne! :D Ech, wiedziałem, że wszystko rozbije się o problem znajomości (a raczej jej braku) odpowiednich poleceń basha :)

Kod wielokrotnie krótszy, a wyświetla jako rzekłeś śliczną tabelkę

Kod: Zaznacz cały

#!/bin/bash
 w3m -dump 'http://www.heavens-above.com/allsats.asp?Mag=3.5&lat=53.533&lng=18.217&loc=Lniano&alt=103&tz=CET' > tmp1
start=$(cat tmp1 | grep -n 'Satellite')
start=$(echo ${start%:*})
stop=$(cat tmp1 | wc -l)
cat tmp1 | tail -n $(( $stop - $start -1)) | head -n $(( $stop - $start - 7)) | grep "°"> ~/skrypty/listasat
rm tmp1
teraz jeszcze muszę wykombinować, jak to wyświetlić w conkym :D

Edycja:
Coś wykombinowałem, może to nie mistrzostwo biegłości programistycznej, ale działa. Powyższy skrypt wrzuciłem do autostartu (jeśli ktoś nie wyłącza kompa codziennie, zawsze można do cronosa ;) ). Generuje on listę satelitów do pliku (u mnie) ~/skrypty/listasat (head i tail są konieczne, by nie wyświetlał informacji o lokalizacji - ta linijka też zawiera znak stopnia)

Następnie stworzyłem plik ~/skrypty/conkysat.sh o treści:

Kod: Zaznacz cały

#!/bin/bash
ile=$(cat ~/skrypty/listasat | wc -l)
if [ $1 -le $ile ] 
then
	wynik=$(cat ~/skrypty/listasat | tr -d "│" | head -n $1 | tail -n 1)
	echo "$wynik"
fi
oczywiście należy nadać prawa do wykonywania, i jazda do .conkyrc, należy na końcu dopisać:

Kod: Zaznacz cały


${alignc}${font Zekton:style=Bold:pixelsize=9}SATELITY${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 1}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 2}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 3}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 4}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 5}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 6}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 7}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 8}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 9}${font Zekton:size=7} 
${alignc}${font Zekton:style=Bold:pixelsize=9}${color}  ${execi 10 ~/skrypty/conkysat.sh 10}${font Zekton:size=7} 
Oczywiście zmieniając czcionki i kolory na używane przez siebie.
Z doświadczenia wiem, że rzadko kiedy widocznych jest więcej niż 10 satelitów (w tym zakresie jasności do 3,5 mag) zatem powinno wystarczyć. Jeśli czegoś brakuje, co za problem dopisać parę linijek
Oczywiście czas może być dużo większy, w końcu zmienia się to raz na 12 godzin
przyda sie jeszcze ustawienie szerokości conky na:

Kod: Zaznacz cały

minimum_size 350 5 
maximum_width 350 
gdyż inaczej ma problem z wyświetlaniem wszystkiego.
Mam nadzieję, że skrypcik się komuś przyda. Dzięki za pomoc!
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Google [Bot] i 11 gości