我正在使用phantomjs和webdriverio来获取并呈现由javascript加载的网页,然后将其保存以供稍后由cheerio解析。 这是代码:
import phantomjs from 'phantomjs-prebuilt'
const webdriverio = require('webdriverio')
const wdOpts = {
desiredCapabilities: {
browserName: 'phantomjs'
}
}
async parse (parseUrl) {
return phantomjs.run('--webdriver=4444').then(program => {
return webdriverio.remote(wdOpts)
.init()
.url(parseUrl)
.waitForExist('.main-ios', 100000)
.pause(5000)
.getHTML('html', true)
.then((html) => {
program.kill()
return html
})
})
}
即使我调用program.kill()
,我注意到进程列表中的phantomjs,它确实耗尽了相当多的RAM和CPU。
我想知道为什么这个过程不会终止。
答案 0 :(得分:3)
.close()只关闭窗口。有一个已知的错误,如果它是最后一个窗口,它会保持打开状态。
.quit()应该这样做,但也存在与之相关的问题。
PhantomJS错误报告:https://github.com/detro/ghostdriver/issues/162
有人在该帖子的底部发布了一个不错的解决方法: https://github.com/SeleniumHQ/selenium/issues/767#issuecomment-140367536 这个修复射出一个SIGTERM结束它:(在python中,但可能有用)
# assume browser = webdriver.PhantomJS()
browser.service.process.send_signal(signal.SIGTERM)
browser.quit()
我喜欢用我的自动化打开一个Docker容器,并在那里运行它。 Docker为我关闭它,但是这超出了你想做的范围。我会推荐上面的SIGTERM + quit方法。
答案 1 :(得分:1)
PhantomJS是一款双组分产品。有一个Javascript在客户端(无论是Web还是其他脚本)上运行,作为代码的一部分。然后是作为服务器端应用程序运行的部分(命令行调用)
我对PhantomJS的经验是,当遇到错误时,PHantomJS服务器端“挂起”但没有响应。如果您可以更新对此脚本的调用以提供输出日志记录,则可以查看PhantomJS应用程序遇到的错误。
phantomjs /path/to/script/ > /path/to/log/file 2>&1
希望这有助于!如果您希望我澄清任何内容,或者详细说明我很乐意更新我的答案,请在评论中告诉我,谢谢!