我有一个脚本需要抓取一个网站。对于每个请求(每个URL),我使用selenium/phantomJS初始化一个新的Web驱动程序。 这种方法是不可扩展的吗?随着时间的推移,它会花费大量的CPU使用吗? 我是否应该只创建一个驱动程序并将其保存在全局变量中的某个位置,并将其重用于所有请求? 这样做是否会导致CPU使用率降低或效果不佳?创建PhantomJS的多个实例或只有一个?
1
A
回答
3
对于每个请求(每个URL),我使用selenium/phantomJS初始化一个新的Web驱动程序。这种方法是不可缩放的吗?随着时间的推移,它会花费大量的CPU使用量吗?
这绝对是一个问题。 PhantomJS
实例通常在CPU上很重,并不是可靠的缩放方式。如果您可以毫无问题地重复使用相同的“webdriver”实例或对性能产生负面影响,请执行此操作。如果没有,请考虑制作一个Selenium grid
多个硒节点 - 实际上会运行浏览器实例的工作人员。您也可以使用远程硒服务器,如BrowserStack
或Sauce 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个并发请求的限制;任何其他请求将排队。
相关问题
- 1. 为“只有一个实例”创建一个Python类?
- 2. 创建一个网关或NAT实例
- 3. NSTimer - 创建多个实例
- 4. jQuery - 创建多个实例
- 5. 创建Uibinder多个实例。
- 6. 只有一个实例,当多个实例具有相同类别时,只能向下滑动一个实例
- 7. Spring创建单例的多个实例?
- 8. 传递现有的FileSystemObject或创建多个实例
- 9. 如何创建Django中只有一个实例的字段?
- 10. C#创建一个实例
- 11. 创建一个MXML实例
- 12. 使用原型创建多个实例使用原型创建多个实例
- 13. 创建一个类的实例或为每个事件创建一个实例会更好吗?
- 14. startService()是否创建一个新的Service实例或使用现有的实例?
- 15. 创建一个对象的新实例,或修改现有的实例?
- 16. Java中,一个类的多个实例重置最新创建的实例
- 17. 创建一个表示多个实例的平均值的实例
- 18. Ninject的InSingletonScope()创建多个实例
- 19. 创建模块的多个实例
- 20. 在libgdx创建多个实例的Box2D
- 21. 创建多个相同的OCX实例
- 22. 创建变量C++的多个实例
- 23. 创建对话框的多个实例
- 24. 创建UIViewController的多个实例
- 25. 如何确保只有一个类可以创建一个A.B实例?
- 26. 我还应该创建一个类吗?如果它只能有一个实例?
- 27. 当一个子类被实例化时,只有一个对象被创建?
- 28. 构建一个具有多个数据库实例或仅仅一个实例的Web应用程序
- 29. axwindowsmediaplayer的多个实例,只有一个允许全屏模式
- 30. 创建一个Django模型实例并创建另一个Django模型实例