Od jakiegoś czasu bawię się w tak zwany scraping stron, czyli rozbijanie html’a na poszczególne elementy w celu wyczytania określonych informacji na stronie. Wszystko jest idealnie, jeżeli nie ma javascript’u na stronie. Strona, którą chcę rozbić tworzy się dynamicznie dzięki javascript. Do scrapowania używam Hpricot’a i Mechanize (chyba dwa najbardziej popularne narzędzia). Z tym, że jak pobieram źródła badanej strony to mi wywala javascript zamiast htmla. Nie wiem co z tym zrobic. Czy może ktoś z Was spotkał się z takim problemem?
Wywala Ci javascripta bo mechanize nie interpretuje js, nie ma w sobie silnika javasript.
Z tego co sie orientuje z konsolowych aplikacji tylko links2 ma czesciowe wsparcie dla javascriptu.
A rozwiazanie Twojego problemu jest trudne, albo bedziesz luskal z javascriptu potrzebne informacje.
Albo pokombinujesz cos z np: v8 - http://code.google.com/p/v8/ - interpreter javascriptu od google.
Dzięki za info. Potrzebowałem potwierdzenia, że nie warto póki co z tym walczyć samemu Będę szukał rozwiązania.
pozdrawiam[/quote]
Możesz spróbować użyć celerity - headless browser. Nie wszystkie javascripty na tym będą poprawnie działały, ale duża część na pewno tak.
Celerity obsługuje javascript na dość sporym poziomie, a nawet ajaxa. Przez kilka godzin go testowałem i doszedłem do wniosku, że posiada nawet większe możliwości niż Hpricot i Mechanize razem wzięte. Oprócz tego świetnie współpracuje z XPath i można jednym zapytaniem pobrać dowolny element ze strony, nawet jeżeli byłby bardzo zakopany. Ogólnie zapowiada się obiecująco.
Okazało się, że przestał mi działać pod JRuby workling i jest straszna lipa, bo jest problem ze znalezieniem czegokolwiek co by jakoś bezboleśnie mogło obsłużyć zadania w tle. Czy ktoś z Was używa background tasków razem z JRuby?
Na szczęście nie było trzeba. Poradziłem sobie z Celerity. Mam jednak taki problem. Czy mogę zrobić tak korzystając z Celerity, że powiedzmy mam pętlę w której klikam 10 linków. Za każdym kliknięciem pobieram obiekt celerity do tabeli, aby każdą z tych klikniętych stron obrobić osobno? Pytam ponieważ próbowałem tak zrobić i nie mogłem. Do tabeli przechodził obiekt Celerity (owszem), lecz zawartość tego obiektu była identyczna we wszystkich elementach tablicy, a była to odpowiedź strony z ostatniego (10) linku. Tak jak by za każdym kliknięciem obiekt zmieniał się w całej tablicy. W sumie to słuszne podejście, bo pewnie celerity trzyma w sobie sesje, ciasteczka i wszystkie te rzeczy, a ktoś by może chciał sobie pobrać 10 różnych obiektów Celerity ze strony, a za 2 dni zacząć je przerabiać, co nie miało by już sensu, gdyż wszystkie informacje byłyby nieważne. Dobrze myślę?
Z tym problemem już się uporałem. Na początku nie mogłem przechowywać obiektów Celerity w tablicy. A kiedy udało mi się to zrobić, okazało się że biorąc któryś element z tablicy, nie mogę z nim nic zrobić (kliknąć w link na stronie na przykład). Poradziłem sobie przerabiając kompletnie algorytm tak aby nic nie przechowywać w tablicy, ale dzialac na danym obiekcie do końca. Problem pojawił się nowy. Otóż potrzebuję uruchamiać Celerity w background jobach. Ale JRuby nie wspiera fork’a i nie można uruchomić procesu worklinga w trybie daemon’a (a kilka procesów to już mowy nie ma). Jestem troche w kropce… muszę trochę odpocząć i pomyśleć na spokojnie… Macie może jakiś pomysł?