我在一大组页面上运行PhantomJS来刮取一些特定的JS生成的内容。我使用Python Selenium绑定,可以很容易地对结果执行XPath查询。我注意到,如果我尝试实例化一个webdriver.PhantomJS
对象并用它执行整个任务(通过“重复使用”它可以这么说),我的脚本很快变得不稳定,伴随着零星的内存和连接问题。我的下一个尝试是尝试为每个渲染调用实例化一个新的驱动程序(并在完成时调用quit()
),这也适用于多个请求。我最后的尝试是使用subprocess
将渲染调用隔离在其自己的进程空间中。但即使这种技术是迄今为止最稳定的技术,但我仍然需要将我的整个脚本包装在supervisor
中,以处理偶尔的打嗝。我真的很想知道我是否可能做错了什么,或者如果有什么我应该知道的。据我所知,PhantomJS(和其他自动化浏览器)并不是真正意义上的本质(更多用于测试),但是有没有办法使其工作在非常稳定的状态?PhantomJS在呈现多个页面时的稳定性
0
A
回答
1
我使用硒与pyvirtualdisplay
与普通的浏览器类似于这样的:Python - Headless Selenium WebDriver Tests using PyVirtualDisplay(尽管我使用的是Chrome;只是一个不同的驱动程序的问题)。
比我在节点和Python中使用PhantomJS的经验稳定得多。以防万一,您仍然可能想要使用流程管理器,但这种方式对我来说已经不那么容易出错。另外,我建议你写一个Python包装类,这样你就可以使用with
块,并确保你的环境总是被清理干净;如果你没有适当地杀掉会话,你最终可能会遇到一个孤立的浏览器吃掉内存。
从我的项目:
import os, time
from selenium import webdriver
from pyvirtualdisplay import Display
class ChromeSession(object):
def __enter__(self):
self.display = Display(visible=0, size=(1024, 768))
self.display.start()
chromedriver = "/usr/lib/chromium/chromedriver"
os.environ["websession.chrome.driver"] = chromedriver
self.driver = webdriver.Chrome(chromedriver)
# Tell the driver to wait (if necessary) in case UI rendering takes a while...
self.driver.implicitly_wait(5)
return self.driver
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type:
print exc_type, exc_val
print exc_tb
self.driver.quit()
self.display.stop()
相关问题
- 1. phantomjs不呈现页面
- 2. PhantomJS无效页面呈现
- 3. PhantomJS呈现的截图比实际页面高很多
- 4. PhantomJs无法呈现源文件中的特定页面
- 5. 用phantomjs呈现javascript网页页
- 6. 页面呈现需要更多时间
- 7. 使PhantomJS等待整个页面加载之前呈现为PDF
- 8. 使用PhantomJS将多个网页呈现为pdf
- 9. Phantomjs呈现在Azure网站
- 10. PhantomJS不会呈现整页内容
- 11. Rails的搜索功能呈现页面多个时间
- 12. PhantomJs在加载一个页面时使用多个TCP连接
- 13. Django同时呈现多个属性?
- 14. 在页面呈现时显示Ajax Loader
- 15. 如何实现浏览页面时稳定的导航栏?
- 16. Grails使用特定布局和多个页面呈现PDF?
- 17. 页面呈现期间出现异常时的错误页面
- 18. 用Phantomjs/Pjscrape刮多个页面
- 19. NReco PhantomJs多于5个PDF页面
- 20. 页面中呈现XML属性值
- 21. ASP.NET MVC页面呈现性能问题
- 22. Anychart使用Flash在一个页面中呈现多个图表
- 23. NodeJs - 在多个SELECT查询后呈现相同的页面
- 24. 页面呈现后的日志时间
- 25. 呈现父页面中的子页面
- 26. Phantomjs呈现XML + XSL吗?
- 27. PhantomJS:抓取多个URL时的空白页面
- 28. ExtJS Grid呈现比页面中指定的更多的行
- 29. 如何在ReportLab platypus中使用BaseDocTemplate呈现多个页面?
- 30. Rails - 仅在显示特定页面时呈现部分