Предотвращение загрузки 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. Спасибо!
Ответы
Ответ 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);
};
''')