Evitar la descarga de CSS / otros recursos en PhantomJS / Selenium controlado por Python

Estoy intentando acelerar el webscraper de Selenium / PhantomJS en Python impidiendo la descarga de CSS / otros recursos. Todo lo que necesito para descargar es img src y las tags alt. He encontrado este código:

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

a través de: ¿Cómo puedo controlar PhantomJS para omitir la descarga de algún tipo de recurso?

¿Cómo / dónde puedo implementar este código en Selenium controlado por Python? O, ¿hay otra forma mejor de detener la descarga de CSS / otros recursos?

Nota: Ya he encontrado cómo evitar la descarga de imágenes editando la variable service_args a través de:

¿Cómo configuro un proxy para phantomjs / ghostdriver en python webdriver?

y

PhantomJS 1.8 con Selenium en python. ¿Cómo bloquear imágenes?

Pero service_args no puede ayudarme con recursos como CSS. ¡Gracias!

Una alma joven y audaz con el nombre de “watsonmw” recientemente agregó una funcionalidad a Ghostdriver (que Phantom.js utiliza para interactuar con Selenium) que permite el acceso a las llamadas a la API de Phantom.js que requieren un objeto de página , como onResourceRequested .

Para una solución a toda costa, considere construir desde la fuente (lo que los desarrolladores señalan “toma aproximadamente 30 minutos … con 4 trabajos de comstackción en paralelo en una máquina moderna”) e integrar su parche, vinculado anteriormente.

Entonces este código Python (no probado) debería funcionar como una prueba de concepto:

 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': []}) 

Hasta entonces, solo obtendrás una excepción ” Can't find variable: page .

¡Buena suerte! Hay muchas alternativas excelentes, como trabajar en un entorno de Javascript, manejar Gecko, proxies, etc.

La respuesta de Will me puso en camino. (Gracias Will!)

PhantomJS actual (1.9.8) incluye Ghostdriver 1.1.0 que ya contiene el parche de watsonmw.

Debe descargar la última versión de PhantomJS, realice lo siguiente (puede que se requiera 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 

Y luego intente esto:

 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': []}) 

Las soluciones propuestas no funcionaron para mí, pero esta funciona (usa 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); }; ''')