一、场景
leader安排了爬虫的任务;
代码采用了selenium调用谷歌浏览器模拟登录,登录后有模拟鼠标点击菜单,最后模拟点击进行翻页;
代码写好了就一直跑啊跑啊。一共4W多页数据,每次差不多爬取了1千多页就会出现chrome崩溃的情况;
如图:
(网上找的图,当时的具体报错找不到了,其实可以重现;)
后来排查到,在运行一段时间后,内存明显被吃满了。到这里可以判断肯定是浏览器把我内存吃了,最后导致自己崩溃了,哈哈;
二、尝试的解决办法
1、代码中使用 try 检测异常
我把爬取翻页的代码放在了try内,试图在浏览器崩溃时被try检测到,从而重新发送请求(相当于刷新),开始爬取数据;
但是… 我想错了;
当浏览器崩溃时,相当于卡主了,代码也就卡主了;
嗯,对,浏览器崩溃不算异常;- . - |
2、刷新
浏览器崩溃时,手动刷新了下,就恢复了,同时也保持了登录后的cookie,并没有退出登录,所以尝试让代码来刷新浏览器;
但是,问题来了,代码检测不到浏览器什么时候崩溃,所以什么时候刷新就成了问题;每隔一段时间刷新一次,这种手法…额…确实会影响效率;
3、清空缓存
在浏览器崩溃时,手动清空了缓存,也可以解决浏览器内存泄漏的问题;
但是,这次遇到了两个问题;
一是,何事进行清空缓存的动作;
二是,清空缓存的代码无法取消cookie的勾;(如果清空了cookie,还得重新进行模拟登陆,所以不能清空cookie)
三、最终解决办法
在查阅了网上的一些资料和同病相怜的博客之后,发现这是seleinum调用chrome的一个bug——内存泄漏;
既然是bug,那…就不用chrome了,换了firefox浏览器之后,一切都解决了。
firefox内核下载:https://github.com/mozilla/geckodriver/releases
调用firefox示例代码:
# browser = webdriver.Chrome(options=option) # 调用谷歌浏览器
browser = webdriver.Firefox() # 调用火狐浏览器
四、参考链接
感谢其他同学提供的参考:
https://blog.csdn.net/zwq912318834/article/details/79000040
https://qa.1r1g.com/sf/ask/4348349491/
https://blog.csdn.net/wt321088/article/details/84986313
https://www.csdn.net/tags/NtjaMg5sNjAzNDMtYmxvZwO0O0OO0O0O.html
https://segmentfault.com/a/1190000040517845