2016-09-27 40 views
8

Mam skrypt PhantomJS który działa gdy uruchamiam go lokalnie (Mac), ale gdy uruchomię go na moim serwerze Linux, zwraca następujący błąd:

ReferenceError: Can't find variable: $ 
https://fantasy.premierleague.com/a/statistics/value_form:5712 in global code 

Kod jest:

var page = require('webpage').create(); 
var fs = require('fs'); 
var args = require('system').args; 
page.settings.userAgent = 'SpecialAgent'; 

page.open('https://fantasy.premierleague.com/a/statistics/value_form', function (status) { 
    if (status !== 'success') { 
     console.log('Unable to access network'); 
    } else { 
     var ua = page.evaluate(function() { 
     var result =""; 
     // ... 
     return result; 
    });  

    } 
    phantom.exit(); 
}); 
+2

dlaczego po prostu nie prosić o ten URL: https://fantasy.premierleague.com/drf/bootstrap-static? Nie widzę korzyści z używania phantomjs, ponieważ w rzeczywistości automatycznie żąda api i pobiera dane. – num8er

+1

Wow ... Nie mogę uwierzyć, że tak naprawdę istnieje, dzięki! –

+1

Które wersje ** PhantomJS ** używasz? Zarejestruj się w zdarzeniach 'onConsoleMessage',' onError', 'onResourceError',' onResourceTimeout' ([Przykład] (https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file-1_phantomerrors-js)). Może są błędy. –

Odpowiedz

-3

nie mam zamiaru do upvote. Dostarczam rozwiązania pozwalające rozwiązać niektóre sytuacje bez symulowania zachowania przeglądarki za pomocą phantomjs tylko po to, aby pobrać dane, które można przetwarzać bezpośrednio, prosząc o adres URL.

Trzeba dane ze strony, więc dlaczego nie zrobić żądania URL: https://fantasy.premierleague.com/drf/bootstrap-static

var request = require('request'); // install: npm i request 
var fs = require('fs'); 
var args = require('system').args; 

request.get({url: 'https://fantasy.premierleague.com/drf/bootstrap-static'}, function(err, response, body) { 
    console.log(body); 
}); 

Jak znalazłem ten link?

Proste:

firebug inspect net

+1

Pakiet request jest napisany dla node.js i nie będzie działał z PhantomJS. Mogłeś pomóc OP, ale nie odpowiedziałeś jeszcze na to pytanie. –

+0

Drogi @ ArtjomB! Odpowiadam na rozwiązanie, którego potrzebuje Phill. A on potrzebuje tylko pobrać dane z innej strony. Dlatego mówię, że nie ma potrzeby phantomjs, gdy istnieje bezpośredni adres URL, który zwraca wszystkie dane jako json. To miejsce, w którym pomagamy rozwiązać ich problemy. I moje rozwiązanie rozwiązało problem parsowania danych. Widzę, że jesteś mądry, więc odpowiedz rozwiązaniem, a nie tylko ignoruj ​​inne odpowiedzi i komentuj. Nie tak postępują szlachetni ludzie. – num8er

+2

To nadal nie pomoże ludziom, którzy chcą korzystać z PhantomJS i przychodzą tutaj * "ReferenceError: Can not find variable: $" *. Pytanie nie zawiera ani jednego słowa, które poparłoby twoją argumentację, że OP chciał tylko pobrać trochę JSON ze strony i nic więcej. Głosowanie jest formą kontroli jakości. Twoja odpowiedź jest w porządku sama w sobie, ale nie ma nic wspólnego z pytaniem, które zadano, i chcę zachować frustrację dla przyszłych czytelników. Czuję się bardzo szlachetnie. –

1

Może wystąpić sytuacja wyścigu między kodu i jQuery ładowane na stronie. Owiń instrukcje w swoim zgłoszeniu zwrotnym page.evaluate za pomocą $(document).ready(function() { /* your statements here */ });, aby upewnić się, że skrypty na stronie zostały w pełni załadowane.

+0

DOM jest gotowy, gdy wywołanie zwrotne 'page.open' jest wywoływane. Ponadto,' $ 'jest * tylko * dostępne wewnątrz ['page.evaluate'] (http://phantomjs.org/api /webpage/method/evaluate.html).Nie można użyć '$' na zewnątrz 'page.evaluate' –

+0

nie można użyć $ (dokument). jeśli jQuery jeszcze się nie załadował – Fer