2016-06-19 19 views
1

我有一个脚本需要抓取一个网站。对于每个请求(每个URL),我使用selenium/phantomJS初始化一个新的Web驱动程序。 这种方法是不可扩展的吗?随着时间的推移,它会花费大量的CPU使用吗? 我是否应该只创建一个驱动程序并将其保存在全局变量中的某个位置,并将其重用于所有请求? 这样做是否会导致CPU使用率降低或效果不佳?创建PhantomJS的多个实例或只有一个?

回答

3

对于每个请求(每个URL),我使用selenium/phantomJS初始化一个新的Web驱动程序。这种方法是不可缩放的吗?随着时间的推移,它会花费大量的CPU使用量吗?

这绝对是一个问题。 PhantomJS实例通常在CPU上很重,并不是可靠的缩放方式。如果您可以毫无问题地重复使用相同的“webdriver”实例或对性能产生负面影响,请执行此操作。如果没有,请考虑制作一个Selenium grid多个硒节点 - 实际上会运行浏览器实例的工作人员。您也可以使用远程硒服务器,如BrowserStackSauce Labs

1

PhantomJS有一个嵌入式网络服务器(Mongoose),您可以运行并接收请求。这避免了每次都需要初始化它。在PhantomJS中升温是相当昂贵的。

这里是PhantomJS样本Web服务器代码,您可以用开始:

var port = 9494; 
var server = require('webserver').create(); 
var page = require('webpage').create(); 

var your_method = function(data) { 
    # Do stuff here 
}; 

service = server.listen(port, function (request, response) { 
    var input = JSON.parse(request.post); 
    page.open(url, function (status) { 
    page.evaluate(your_method, input) 
}); 

if (service) { 
    console.log('Server running on port ' + port); 
} else { 
    console.log('Error: Could not create web server listening on port ' + port); 
    phantom.exit(); 
} 

从文档;

这是为了便于沟通的PhantomJS脚本 和外部世界之间,不建议用作一般 生产服务器。目前有10个并发请求的限制;任何其他请求将排队。

相关问题