2013-11-26 14 views
5

muszę pobrać następującą stronę internetową: http://m.10bet.com/#leage_panel#10096strony skrobanie: Czekam, aż strona jest całkowicie załadowany

To jest strona zakłady sportowe i muszę cytaty. Przede wszystkim wydaje się to dość proste. Jednak tutaj jest to, co dzieje się (można to sprawdzić z np narzędzia programistyczne w przeglądarce.):

  1. otworzyć URL
  2. strona wczytuje początkową HTML, który następnie wywołuje żądania AJAX do pobierania cytaty
  3. Jednak cytat jest zawarty w jsonie, ALE są one pomijane, tak że nie można ich po prostu sparsować bezpośrednio z wywołania ajax. Dodatkowo javascript strony internetowej jest również obruszony. Więc nie ma możliwości, aby bezpośrednio przeczytać cytaty z wniosku.

Zamiast tego potrzebuję przeglądarki bezgłowej, która potrafi ocenić javascript. HtmlUnit dla java jest niewystarczające, ponieważ nie oferuje solidnej funkcjonalności javascript. Dlatego PhantomJS w połączeniu z CasperJS to mój obecny wybór. Stosuję CasperJS z następującym skryptem:

var casper = require('casper').create(); 

casper.start('http://m.10bet.com/#leage_panel#10096', function() { 
    var url = 'http://m.10bet.com/#leage_panel#10096'; 
    this.download(url, '10bet.html'); 
}); 

casper.run(function() { 
    this.echo('Done.').exit(); 
}); 

Jednak ten skrypt nie ładuje całej strony. Tylko główna strona. Jak mogę załadować całą stronę tak, jak jest prezentowana w przeglądarce?

+0

Nie znam tych narzędzi, ale czy możesz dołączyć swój kod do zdarzenia 'domready'? To może zrobić. – halfer

Odpowiedz

7

Ten skrypt wygląda na dobry początek, ale zaraz po wczytaniu strony (HTML) skrypt (CasperJS) zatrzymuje się, ponieważ nie przekazano mu dalszych instrukcji. Grubym sposób naprawić to byłoby iść spać przez kilka sekund, a następnie zeskrobać strony:

var casper = require('casper').create(); 
var fs=require('fs'); 

casper.start('http://m.10bet.com/#leage_panel#10096', function() { 
    this.wait(2000, function() { 
     fs.write("10bet.html", this.getHTML()); 
    }); 
}); 

casper.run(); 

2000ms czasu jest surowy dla kilku powodów:

  1. Jeśli dane ładują się szybciej niż marnujesz czas.
  2. Jeśli ładuje się wolniej, skrypt nie działa.

Lepiej jest zidentyfikować coś na stronie, którą chcesz i potrzebujesz, a następnie użyć jednej z funkcji Caspera waitForXXX(). Zobacz dokumentację interfejsu API zaczynającą się tutaj: http://casperjs.readthedocs.org/en/latest/modules/casper.html#waitfor

Jako inny punkt, przypuszczam, że tak naprawdę nie chcesz całej strony HTML, tylko dane w niej zawarte. getHTML() przyjmuje parametr do filtrowania otrzymanych danych. Na przykład. w twoim przypadku getHTML('#league_block') może być znacznie bardziej użyteczny. Ponownie zobacz dokumentację API, aby uzyskać więcej pomysłów.

+0

Hej Darren! Byłeś zbyt szybki. Chciałem opublikować Twoje sugestie jako odpowiedź na moje pytanie. Użyłem waitForResource (...). Działa idealnie dobrze. Dzięki za pomoc! :) – toom

Powiązane problemy