2012-02-28 5 views
49

phantomjs имеет конфигурационный LoadImage,Как я могу управлять PhantomJS, чтобы пропустить загрузку какого-то ресурса?

, но я хочу больше,

, как я могу контролировать phantomjs, чтобы пропустить загрузки какой-то ресурс,

, такие как CSS и т.д ...

== ===

хорошие новости: эта функция добавлен.

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

Суть:

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

Я также хотел бы знать это, как сделать phantomjs пропустить конкретный ресурс – iwek

+3

хорошая новость: эта функция добавлена. – atian25

+3

@ user2864740 Зачем редактировать его в вопрос и не публиковать как ответ? –

ответ

7

Итак, наконец, вы можете попробовать это http://github.com/eugenehp/node-crawler

иначе вы можете попробовать ниже подход с PhantomJS

Простым способом, заключается в load page -> parse page -> исключить нежелательный ресурс -> загрузить его в PhatomJS.

Другой способ - просто заблокировать хосты в брандмауэре.

При необходимости вы можете использовать прокси-сервер для блокировки определенных URL-адресов и запросов к ним.

И еще один, загрузите страницу, а затем удалите ненужные ресурсы, но я думаю, что здесь не правильный подход.

+0

Интересно, почему PhatomJS этого не делает? когда-нибудь, нам нужно загрузить много страниц без css/img, не может исключить нежелательный ресурс вручную – atian25

+0

Существует такая вещь, как page.content, вы можете манипулировать им с помощью каких-либо фильтрующих ресурсов с использованием регулярных фильтров (css, js). Или вы можете просто обходить веб-страницу и анализировать только изображения, которые вы хотите оставить. –

+0

благодарит за ответ. Вы имели в виду, что есть интерфейс фильтра/api, предоставленный Phantomjs, что мы можем пропустить какой-то ресурс?(не загружайте его больше). Каково имя апи? – atian25

3

Пока нет (phantomjs 1.7), он НЕ поддерживает это.

Но противный решение использует HTTP прокси-сервер, так что вы можете отсеивать некоторый запрос, что вам не нужно

+0

Конечно, это лучшее решение, кстати, вы всегда должны использовать прокси (лак или squid), чтобы «контролировать» то, что загружают ваши программы (добавить очередность, кеширование и т. д.) –

6

Использование page.onResourceRequested, как в примере 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

Обновлено, рабочая !

Поскольку PhantomJS 1.9, существующий ответ не работал. Вы должны использовать этот код:

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() 
    } 
}; 

Если вы используете прерывание() вместо того, чтобы отменить(), это вызовет onResourceError.

Вы можете look at the PhantomJS docs

+0

phantomjs 2.1.1 no cancel() just abort() – waza123

+0

@ waza123 должен работать в любом случае – webo80