我有一个需要抓取网站的脚本。对于每个请求(每个URL),我使用selenium / phantomJS初始化一个新的Web驱动程序。 这种方法是不可扩展的,并且随着时间的推移会花费大量的CPU使用吗? 我是否应该只创建一个驱动程序并将其保存在全局变量中并将其重用于所有请求? 这样做会导致CPU使用率降低还是不会有效?
答案 0 :(得分:3)
对于每个请求(每个URL),我使用selenium / phantomJS初始化一个新的Web驱动程序。这种方法是不可扩展的,并且随着时间的推移会花费大量的CPU使用吗?
这绝对是个问题。 PhantomJS
实例通常在CPU上很重,并且它不是可靠的扩展方式。如果您可以重复使用相同的“webdriver”实例而不会出现问题或对性能产生负面影响,请执行此操作。如果没有,请考虑制作一个具有多个selenium节点的Selenium grid
- 实际上有浏览器实例运行的工作者。您还可以考虑使用远程selenium服务器,例如BrowserStack
或Sauce Labs
。
答案 1 :(得分:1)
PhantomJS有一个嵌入式网络服务器(Mongoose),您可以运行和接收请求。这避免了每次都需要初始化它。在PhantomJS中,升温是非常昂贵的。
以下是PhantomJS中的示例网络服务器代码,您可以从以下开始:
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个并发的限制 要求;任何其他请求将排队等候。