Подтвердить что ты не робот

Предотвращение загрузки CSS/другого ресурса в PhantomJS/Selenium, управляемом Python

Я пытаюсь ускорить веб-сканер Selenium/PhantomJS в Python, предотвращая загрузку CSS/других ресурсов. Все, что мне нужно скачать, это теги img src и alt. Я нашел этот код:

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

через: Как я могу управлять PhantomJS, чтобы пропустить загрузку какого-то ресурса?

Как/где я могу реализовать этот код в Selenium, управляемом Python? Или есть еще один лучший способ остановить загрузку CSS/других ресурсов?

Примечание. Я уже нашел, как предотвратить загрузку изображений, отредактировав переменную service_args с помощью:

Как установить прокси для phantomjs/ghostdriver в python webdriver?

и

PhantomJS 1.8 с Selenium на python. Как заблокировать изображения?

Но service_args не может помочь мне с такими ресурсами, как CSS. Спасибо!

4b9b3361

Ответ 1

Смелая молодая душа по имени "watsonmw" недавно добавила функциональность Ghostdriver (который Phantom.js использует для взаимодействия с Selenium), что позволяет получить доступ к Phantom.js API-вызовы, для которых требуется объект страницы, например onResourceRequested, который вы указали.

Для решения любой ценой подумайте о создании из источника (отмечает разработчик "занимает около 30 минут... с 4 параллельными компиляциями на современной машине" ) и интегрирует свой патч, связанный выше.

Затем этот (непроверенный) код Python должен работать как доказательство концепции:

from selenium import webdriver
driver = webdriver.PhantomJS('phantomjs')

# hack while the python interface lags
driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')

driver.execute('executePhantomScript', {'script': '''
page.onResourceRequested = function(requestData, request) {
    // ...
}
''', 'args': []})

До тех пор вы просто получите исключение Can't find variable: page.

Удачи! Есть много отличных альтернатив, например, работа в среде Javascript, управление Gecko, прокси и т.д.

Ответ 2

Будет отвечать на меня. (Спасибо, будет!)

Текущий PhantomJS (1.9.8) включает Ghostdriver 1.1.0, который уже содержит патч watsonmw.

Вам необходимо загрузить последнюю версию PhantomJS, выполнить следующие действия (sudo может потребоваться):

ln -s path/to/bin/phantomjs  /usr/local/share/phantomjs
ln -s path/to/bin/phantomjs  /usr/local/bin/phantomjs
ln -s path/to/bin/phantomjs  /usr/bin/phantomjs

И затем попробуйте следующее:

from selenium import webdriver
driver = webdriver.PhantomJS('phantomjs')

# hack while the python interface lags
driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')

driver.execute('executePhantomScript', {'script': '''
    var page = this; // won't work otherwise
    page.onResourceRequested = function(requestData, request) {
    // ...
}
''', 'args': []})

Ответ 3

Предлагаемые решения не сработали для меня, но этот работает (он использует driver.execute_script):

driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')

driver.execute_script('''
    this.onResourceRequested = function(request, net) {
        console.log('REQUEST ' + request.url);
    };
''')