使用PhantomJS与Selenium一起使用失控内存

dok*_*kay 7 python linux selenium amazon-ec2 phantomjs

我用Python编写了一个脚本,它迭代了很长的网页列表并收集数据,使用Selenium和PhantomJS作为webdriver(因为我在运行Linux的远程终端机上运行它,需要使用无头浏览器).对于简短的工作,例如,它必须迭代几页,没有问题.但是,对于较长的作业,它必须遍历更长的页面列表,我看到每次加载新页面时内存使用量会随着时间的推移而显着增加.最终在大约20多页之后,脚本因内存溢出而被终止.

以下是我初始化浏览器的方法 -

from selenium import webdriver

url = 'http://someurl.com/'
browser = webdriver.PhantomJS()
browser.get(url)
Run Code Online (Sandbox Code Playgroud)

页面有下一个按钮,我通过找到'Next>'按钮的xpath遍历页面 -

next_xpath = "//*[contains(text(), 'Next >')]"
next_link  = browser.find_element_by_xpath(next_xpath)
next_link.click()
Run Code Online (Sandbox Code Playgroud)

我尝试通过以下方式清除PhantomJS浏览器的cookie和缓存 -

browser.get('javascript:localStorage.clear();')
browser.get('javascript:sessionStorage.clear();')
browser.delete_all_cookies()
Run Code Online (Sandbox Code Playgroud)

但是,这些都没有对内存使用产生任何影响.当我使用Firefox驱动程序时,在我的本地计算机上它没有任何问题,但应该注意我的本地计算机比远程服务器有更多的内存.

如果遗漏任何重要信息,我表示歉意.请随时告诉我如何使我的问题更全面.

小智 0

如果无头浏览器适合您,我想建议一个解决方案来帮助我解决类似的内存问题。使用AWS Lamda作为您的服务器,使用并行执行库xdist和 bingo,您永远不会遇到内存问题,因为 Lamada 是托管服务,请确保将捕获的数据上传到 S3 并清理 lamda 上的临时目录。(我已经在我的一个项目中实现了这一点,并且效果非常好)