14

我试图通过阻止下载 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();
    }
};

via:如何控制 PhantomJS 跳过下载某种资源?

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

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

如何在 python webdriver 中为 phantomjs/ghostdriver 设置代理?

在 python 上带有 Selenium 的 PhantomJS 1.8。如何阻止图像?

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

4

3 回答 3

7

一个名叫“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、代理等。

于 2013-10-10T14:00:18.090 回答
4

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

当前的 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': []})
于 2014-11-18T10:34:51.613 回答
2

提出的解决方案对我不起作用,但这个有效(它使用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);
    };
''')
于 2016-04-05T13:18:57.363 回答