2012-01-19 11 views
13

ja próbując drapać poniższą stronę internetową:PhantomJS pobrać przy użyciu javascript odnośnik

http://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2011&month=0&season1=2011&ind=0&team=0&rost=0&players=0

Jeśli kliknij mały przycisk w prawym górnym rogu tabeli zatytułowanej „Eksport danych”, javascript skrypt działa, a moja przeglądarka pobiera plik w postaci .csv. Chciałbym móc napisać skrypt PhantomJS, który może to zrobić automatycznie. Jakieś pomysły?

Powyższy przycisk jest zakodowana w HTML, takich jak:

<a id="LB_cmdCSV" href="javascript:__doPostBack('LB$cmdCSV','')">Export Data</a></div> 

Ja również znaleźć tej funkcji w kodzie źródłowym HTML:

<script type="text/javascript"> 
//<![CDATA[ 
var theForm = document.forms['form1']; 
if (!theForm) { 
    theForm = document.form1; 
} 
function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 
//]]> 
</script> 

jestem bardzo nowy PhantomJS/JavaScript i może użyj tutaj niektórych wskaźników. Myślę, że znalazłem wszystkie informacje, których potrzebuję, aby to zrobić automatycznie (popraw mnie, jeśli się mylę), ale nie wiem, od czego zacząć kodowanie. Dzięki za pomoc.

EDIT - To jest to, co mój skrypt wygląda teraz:

var page = new WebPage(); 
url = 'http://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2011&month=0&season1=2011&ind=0&team=0&rost=0& players=0'; 

page.open(encodeURI(url), function (status){ 
    if (status !== "success") { 
    console.log("Unable to access website"); 
    } else { 
     page.evaluate(function() { 
     __doPostBack('LB$cmdCSV', ''); 
     }); 
    } 
    phantom.exit(0); 
}); 

Odpowiedz

0

nie można po prostu uruchomić kod, __doPostBack('LeaderBoard1$cmdCSV','');, w ramach strony internetowej?

coś takiego:

page.evaluate(function() { 
    __doPostBack('LeaderBoard1$cmdCSV',''); 
}); 

nie testowałem ten kod w PhantomJS, ale teoretycznie powinno działać, ponieważ działa metodę __doPostBack z konsoli dewelopera Google Chrome pracował. Jeśli masz wątpliwości co do uruchomienia kodu JavaScript w PhantomJS, konsola programistów Google Chrome to świetny sposób na przetestowanie kodu, ponieważ działa on na WebKit, jak PhantomJS. Mam nadzieję, że to pomoże.

+0

dzięki za wskazówki. Rozpocząłem testowanie rzeczy w konsoli programisty Chrome i mam javascript do pracy i pliki do pobrania poprawnie. Jednak przy uruchomieniu tego samego kodu z linii poleceń za pomocą phantomJS nic się nie dzieje. Czy to możliwe, ponieważ muszę określić, gdzie pobrać plik (podczas gdy ustawienia Chrome zawsze umieszczają go w katalogu/home/downloads /)? –

+0

Dodano również mój obecny skrypt do OP –

+0

Ta metoda nie działa dla mnie w casperJS. Chociaż robię to na innej stronie ASPX. – Erik

-1

Jest to strona internetowa z obsługą ASP, więc będzie to odrobinę trudniejsze niż większość i będziesz musiał użyć komend cURL, aby naśladować POSTing całego formularza stan & łańcuchów zdarzeń z powrotem na serwer. Prawdopodobnie po prostu będzie łatwiej, po prostu wyciągnij dane prosto ze strony, którą masz.

+0

Dzięki za odpowiedź (chociaż jestem trochę zdezorientowany). Wcześniej chciałem pobrać dane prosto ze strony internetowej za pomocą BeautifulSoup i Python, gdy była tylko jedna strona dla tabeli. Strona internetowa zmieniła jednak tabelę tak, aby zawierała wiele stron dostępnych za pośrednictwem funkcji javascript. Ta funkcja po raz kolejny __doPostBack i jest wywoływana jako taka: javascript: __ doPostBack ('LB $ dg1 $ ctl00 $ ctl02 $ ctl00 $ ctl05', ''). Czy istnieje sposób, że mogę zeskrobać informacje ze stołu, a następnie zmienić stronę za pomocą tej funkcji? Mógłbym wtedy po prostu powtórzyć, dopóki nie zdrapię każdej strony. –

-1

Używam Ruby on Rails i Watir Webdriver (https://github.com/watir/watir-webdriver).

Zidentyfikowaliśmy to narzędzie przy użyciu ASP.NET przy użyciu identycznej przeglądarki "doPostBack" używanej przez zdefiniowanego przez klienta Agenta użytkownika. Podczas korzystania z PhantomJS, agent użytkownika jest identyfikowany jako coś "Mozilla/5.0 (Unknown, Linux i686) AppleWebKit/534.34 (KHTML, jak Gecko) Safari/534.34 PhantomJS/1.9.1".

Dlatego konieczna jest zmiana klienta klienta użytkownika przed uzyskaniem dostępu do strony. Szyny i zrobiłem coś takiego:

HTTP_USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:22.0) Gecko/20100101 Firefox/22.0" 
HTTP_DRIVER  = Selenium::WebDriver.for :phantomjs, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.phantomjs(
    "phantomjs.page.settings.userAgent" => HTTP_USER_AGENT 
) 
... 
browser = Watir::Browser.new HTTP_DRIVER, :http_client => client 
0

To, co zadziałało bardzo dobrze, to symulowanie kliknięć myszką na żądanym elemencie.

page.evaluate(function() { 
    var btn = document.getElementById('LB_cmdCSV') 
    var ev = document.createEvent('MouseEvent') 
    ev.initEvent('click', true, true) 
    btn.dispatchEvent(ev) 
}) 
Powiązane problemy