2012-02-28 27 views
49

phantomjs ma config LoadImage,Jak mogę kontrolować PhantomJS, aby pominąć pobieranie jakiegoś zasobu?

ale chcę więcej,

jak mogę kontrolować phantomjs pominąć pobieranie jakiś zasób,

takich jak CSS etc ...

== ===

dobra wiadomość: ta funkcja została dodana.

https://code.google.com/p/phantomjs/issues/detail?id=230

Istota:

page.onResourceRequested = function(requestData, request) { 
    if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || requestData['Content-Type'] == 'text/css') { 
     console.log('The url of the request is matching. Aborting: ' + requestData['url']); 
     request.abort(); 
    } 
}; 
+0

Chciałbym również wiedzieć, to, jak sprawić, by phantomjs pominąć danego zasobu – iwek

+3

dobrą wiadomość: ta funkcja jest dodawany. – atian25

+3

@ user2864740 Po co edytować go w pytaniu i nie publikować jako odpowiedzi? –

Odpowiedz

7

Więc w końcu można spróbować to http://github.com/eugenehp/node-crawler

inaczej można jeszcze spróbować poniższego podejście PhantomJS

Prosty sposób, jest załaduj stronę -> przeanalizuj stronę -> wykryj niechciane zasoby -> załaduj do PhatomJS.

Innym sposobem jest po prostu zablokowanie hostów w zaporze.

Opcjonalnie można użyć serwera proxy do blokowania określonych adresów URL i zapytań.

I dodatkowy, załaduj stronę, a następnie usuń niechciane zasoby, ale myślę, że nie jest to właściwe podejście.

+0

Zastanawiam się, dlaczego PhatomJS sam tego nie robi? czasami musimy załadować dużą ilość stron bez css/img, nie możemy wykluczyć niechcianego zasobu ręcznie – atian25

+0

Istnieje coś takiego jak page.content, można nim manipulować przy użyciu pewnych filtrów przy użyciu filtrów regex (css, js). Możesz też po prostu zaindeksować stronę i przeanalizować tylko te obrazy, które chcesz pozostawić. –

+0

dzięki za odpowiedź. Czy miałeś na myśli, że istnieje jakiś interfejs filtrujący/api dostarczony przez Phantomjs, że możemy pominąć jakiś rodzaj zasobów?(nie pobieraj więcej). jakie jest imię api? – atian25

3

Nie ma mowy na razie (phantomjs 1.7), NIE obsługuje tego.

Ale paskudna rozwiązaniem jest użycie serwera proxy HTTP, dzięki czemu można odfiltrowania jakiś wniosek, że nie trzeba

+0

Oczywiście jest to najlepsze rozwiązanie, przy okazji zawsze powinieneś używać proxy (lakier lub squid), aby "kontrolować" to, co pobierają twoje programy (aby dodać kolejkowanie, buforowanie itp.) –

6

Korzystając page.onResourceRequested, jak w przykładzie loadurlwithoutcss.js:

page.onResourceRequested = function(requestData, request) { 
    if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || 
      requestData.headers['Content-Type'] == 'text/css') { 
     console.log('The url of the request is matching. Aborting: ' + requestData['url']); 
     request.abort(); 
    } 
}; 
14

aktualizowane, Praca !

Od wersji PhantomJS 1.9 istniejąca odpowiedź nie działa. Musisz użyć tego kodu:

var webPage = require('webpage'); 
var page = webPage.create(); 

page.onResourceRequested = function(requestData, networkRequest) { 
    var match = requestData.url.match(/wordfamily.js/g); 
    if (match != null) { 
    console.log('Request (#' + requestData.id + '): ' + JSON.stringify(requestData)); 
    networkRequest.cancel(); // or .abort() 
    } 
}; 

Jeśli używasz abort() zamiast anulować(), będzie to powodować onResourceError.

Można look at the PhantomJS docs

+0

phantomjs 2.1.1 nie anuluj() po prostu abort() – waza123

+0

@ waza123 i tak musi działać – webo80

Powiązane problemy