[Hpricot/Mechanize] Scraping stron i javascript

Witam wszystkich,

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?

pozdrawiam serdecznie

Hejo,

hpricot juz jest die, bo _why’a nie ma, wiecej na: http://www.rubyinside.com/why-the-lucky-stiff-is-missing-2278.html :frowning:
Ale to jest stary temat.

Aktualnie mechanize korzysta z nokogiri: http://nokogiri.org/

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.

Tutaj masz przyklad z v8:

Hej,

Dzięki za info. Potrzebowałem potwierdzenia, że nie warto póki co z tym walczyć samemu :slight_smile: Będę szukał rozwiązania.

pozdrawiam

[quote=dazz]Hej,

Dzięki za info. Potrzebowałem potwierdzenia, że nie warto póki co z tym walczyć samemu :slight_smile: 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.

Właśnie instaluje JRuby i zobacze co on tam potrafi. Jak patrzyłem na dokuemntację to wygląda na to, że posiada większe możliwości niż Mechanize.

Dzięki

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?

Sprawdź Culerity. To jest narzędzie, które umożliwia korzystanie z celerity w ruby 1.8.6/7 (na 1.9 culerity niestety jeszcze nie chodzi).

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ę?

Nie rozumiem do końca jak dokładnie to robisz, mógłbyś wkleić kawałek kodu?

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ł?

pozdro