Skocz do zawartości

Pobieranie Fragmentu Strony


borzole

Rekomendowane odpowiedzi

Witam,

Czy jest możliwość pobrania tylko fragmentu strony np. tylko jednego bloku div? Chciałem sobie zrobić coś na wzór powiadomienia rss z jednej strony i obecnie skrypt ściąga całą stronę, a następnie filtruje wybrany fragment. Ewentualnie czy jest jakiś skaner monitorujący wybrany fragment na stronie. Typowe skanery głupieją jeśli na stronie jest dynamicznie zmieniająca się zawartość z jakiejś kolumny.

Odnośnik do komentarza
Udostępnij na innych stronach

Dobrze szanująca się witryna powinna udostępnić kanał rss z takich bloków o częstej aktualizacji

Jeżeli nie rss to python, perl .....

Ale na pewno do tych konkluzji sam doszedłeś.Ameryki to ja nie odkryłam

Widziałam kiedyś takie możliwości w pythonie ale muszę pogrzebać to przedstawię.

Odnośnik do komentarza
Udostępnij na innych stronach

Web scrapping to się nazywa

http://www.packtpub.com/article/web-scraping-with-python

Swego czasu zastanawiałem się aby właśnie zrobić taki czytnik RSS dla stron które nie mają RSS, wybierasz blok który chcesz obserwować i jesteś informowany o aktualizacjach)(

 

Odnośnik do komentarza
Udostępnij na innych stronach

eh, znowu ten python, trzeba będzie się go kiedyś naumieć :) a tymczasem poszedłem po bandzie i zrobiłem najprościej jak się dało w bash jak zwykle :lol:

 

#!/bin/bash

 # na potrzeby cron
 export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

 #parametry
 BASE=${0}
 ARGS=${@}
 # dzięki temu wystarzy dodać stronę do ulubionych by ją skanować
 FILE=/home/lucas/.mozilla/firefox/profil.lucas/bookmarks.html

 #[email protected]
 MYMAIL=$(my mail)
LOG=$HOME/.log

 # -------------------------------------------------------------------------------------------------
 #
 send_message(){
     PAGE=${1}
     echo ${PAGE} | mutt -s "Zmiany na stronie" ${MYMAIL} 
 }

 # -------------------------------------------------------------------------------------------------
 # funkcje ogólne
 get_links(){
     # w następnych liniach są wyjątki stron, których nie skanujemy
     grep ${1} ${FILE} | cut -d\" -f2 | cut -d\# -f1 \
         | grep -v "http://www.dobreprogramy.pl/Blog.html"
 }

 check_changes(){    
     #wyświetl wsio od drugiego parametru
     PAGE=${@:2}
     MARKER=$(${BASE} get_marker_${1} ${@})
     DIR=${LOG}/${PAGE%/*}
     OLD=${LOG}/${PAGE}
     mkdir -p ${DIR} 2>/dev/null

     echo -ne ${PAGE} " :: " ${MARKER}      

     if [ -f ${OLD} ]; then
         # ten warunek potrafi sprawdzić tylko dwie liczby
         # można to przebudować
         if [ $(cat ${OLD}) != ${MARKER} ] ; then
             echo -e " :: ZMIANY " 
             ${BASE} send_message ${PAGE}
         else
             echo -e " :: po staremu"
         fi
     else
         echo -e " :: poraz pierwszy" 
     fi

     # aktualizacja
     echo -e ${MARKER}  > ${OLD}
 }

 go(){
     get_links ${1} | xargs -i ${BASE} check_changes ${1} '{}'
 }

 # -------------------------------------------------------------------------------------------------
 # SZABLON dla stron: get_marker_NAZWA(){
 get_marker_dobreprogramy.pl(){
     # funkcja specyficzna dla danej strony (znacznik), 
     # tutaj np. wyrzuca licznik komentarzy pod danym newsem
     curl -s ${@} | grep "komentarze (" | cut -d\( -f2 | cut -d\) -f1
     # alternatywnie można zliczać ilość znaków w danym fragmencie
 }

 # -------------------------------------------------------------------------------------------------
 # tu wpisywać kolejne serwisy
 main(){
     ${BASE} go dobreprogramy.pl
     # żeby skanować inną stronę trzeba zrobić funkcję: get_marker_NAZWA
     # i uruchomić przez
     # ${BASE} go NAZWA
 }
 # uruchomienie funkcji głównej lub tej z parametru
 if [ -n "$1" ] ; then 
     ${ARGS}
 else 
     main
 fi
 # wyjście z przekazaniem kodu wyjścia ostatniego polecenia
 exit $?

 

To działa tylko dla dobreprogramy.pl ale jak się przyjrzeć to łatwo dostosować. Żeby śledzić stronę wystarczy ją dodać do zakładek w firefox. Na początku bawiłem się w jakieś parsery xmlowe żeby konkretnie co i jak się zmieniło ...ale wymiękłem. Za dużo czasu dla zwykłego powiadomienia.

Odnośnik do komentarza
Udostępnij na innych stronach

A tak już zupełnie na koniec. Czy w ogóle jest możliwe pobierania części strony? Wczoraj się bawiłem php+curl i patrząc na czas odpowiedzi to jednak te metody sprowadzają się chyba zawsze do tego samego: ściągnij całą stronę i wyłuskaj żądany fragment. Nie jestem pewny, ale chyba tylko nagłówek strony można ściągnąć osobno. Rzuci ktoś na to światło?

Odnośnik do komentarza
Udostępnij na innych stronach

Ja tam zdecydowanie wolę parsowanie dokumentów DOM. Bardziej czytelnie i mniej pisania. Parsowanie "liniowe" ma w zasadzie tylko tą zaletę, że zużywa mniej pamięci. Obecnie w w moim Djangowym projekcie używam biblioteki lxml, a dokładnie:

from lxml.html import parse, fromstring

Jedna z tych funkcji pobiera html z pliku, druga ze stringa. Potem już tylko operujemy na węzłach xml-owego drzewa, najlepiej za pomocą XPath. Wyciągnięcie elementów DIV to wtedy jedna linijka kodu:

divs = rootnode.xpath('.//div')

 

Borzole: naprawdę polecam pythona, jeden z najbardziej elastycznych języków jakie w życiu widziałem B)

Odnośnik do komentarza
Udostępnij na innych stronach

Potknąłem się dzisiaj o groovy i jeśli chodzi o parsowanie czystego xml to demon nie język,

przykład: http://www.ibm.com/developerworks/java/library/j-pg05199/

ale jak tylko chciałem obrabiać stroną xhtml to porażka. Zupełnie nie umiem się tym obsługiwać :lol:

Chyba mam hobby na następne pół roku ( python mnie jakoś nie wzrusza, ale ten groovy bajkowy).

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

Jakoś tak dziś przypadkiem znalazłem proste narzędzie xml_grep

Zagatka co to :lol:

#!/bin/bash
     
     tmpfile="http://fedora.pl/"
     # znaleźć ścieżkę za pomocą firebug'a 
     xpath="/html/body/div/div[4]/ul/ul"
     
     xml_grep -t  "$xpath" $tmpfile 2>/dev/null

Nadal nie jest idealnie, ale coś działa. Wcześniej na siłę próbowałem xmlstarlet ale tylko czysty xml działał.

 

[EDIT]

Ostatecznie wygląda to tak (bez xml_grep):

http://dl.dropbox.com/u/409786/pub/bin/dp.sh

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...