防止在 Python 驱动的 PhantomJS/Selenium 中下载 CSS/其他资源

Posted

技术标签:

【中文标题】防止在 Python 驱动的 PhantomJS/Selenium 中下载 CSS/其他资源【英文标题】:Prevent CSS/other resource download in PhantomJS/Selenium driven by Python 【发布时间】:2013-10-06 14:27:45 【问题描述】:

我正在尝试通过阻止下载 CSS/其他资源来加速 Python 中的 Selenium/PhantomJS webscraper。我只需要下载 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();
    
;

通过:How can I control PhantomJS to skip download some kind of resource?

如何/在哪里可以在 Python 驱动的 Selenium 中实现此代码?或者,还有其他更好的方法来阻止 CSS/其他资源下载吗?

注意:我已经找到了如何通过编辑 service_args 变量来防止图像下载:

How do I set a proxy for phantomjs/ghostdriver in python webdriver?

PhantomJS 1.8 with Selenium on python. How to block images?

但是 service_args 无法帮助我处理 CSS 等资源。谢谢!

【问题讨论】:

如果您只需要 html 并从页面中选择元素,Selenium/PhantomJS 是最佳选择吗?您是否考虑过使用python-requests? @brechin,这是个好主意,谢谢!不幸的是,我不认为 python-requests 可以获得 javascript 注入的内容。例如,请参阅此页面上的主图像:everlane.com/collections/mens-luxury-tees/products/…。 <div id="content" class="clearfix"> 中的所有内容都是通过backbone.js 注入的,在python-requests 的输出中,我只是得到了一个带有<!-- Filled in by Chaplin --> 注释的空div……我可能会遗漏什么吗? 我会查看请求并获取 everlane.com/api/collections 【参考方案1】:

一个大胆的年轻灵魂,名为“watsonmw”recently added Ghostdriver(Phantom.js 用于与 Selenium 交互)的功能,允许访问 Phantom.js API calls which require a page object,就像您引用的 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、代理等。

【讨论】:

该补丁似乎已经在 Ghostdriver 1.1.0 中,但是当我启动它(使用phantomjs /path/to/ghostdriver/1.1.0/src/main.js)并连接到它(使用driver = webdriver.PhantomJS(port=8910))时,我仍然得到Can't find variable: page【参考方案2】:

Will 的回答让我走上了正轨。 (谢谢威尔!)

当前的 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);
    ;
''')

【讨论】:

以上是关于防止在 Python 驱动的 PhantomJS/Selenium 中下载 CSS/其他资源的主要内容,如果未能解决你的问题,请参考以下文章

将 PhantomJS 与 Selenium Webdriver 和 Python 一起使用

使用 Python/PhantomJS/Selenium 滚动无限页面

如何用python+selenium+phantomjs获得一个网页的动态生成的html代码

当URL错误时,PhantomJS不会返回错误(python)

Selenium/PhantomJS 引发错误

[Python爬虫] 之十一:Selenium +phantomjs抓取活动树中会议活动