seleinum调用chrome长时间运行后出现崩溃

一、场景

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

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
pb 是 Protocol Buffer 的缩写,它是一种轻量级、高效的数据结构和序列化机制,用于在不同的软件系统之间进行数据通信和存储。 在调用 chrome 浏览器时,可以使用 pb 来实现与浏览器间的数据交互。通过定义适当的 Protocol Buffer 消息和服务,在客户端和服务端之间进行通信。 首先,需要定义一个 Protocol Buffer 的消息,用于传递与浏览器相关的信息,例如浏览器的命令、URL 等。消息的定义可以包括字段如下: message ChromeCommand { string command = 1; string url = 2; // 可以添加更多的字段 } 然后,定义一个 Protocol Buffer 的服务,用于发送和接收浏览器相关的消息。服务的定义可以包括方法如下: service ChromeService { rpc SendCommand(ChromeCommand) returns (ChromeResponse); // 可以添加更多的方法 } 在客户端的代码中,可以使用 pb 的库函数来创建一个 ChromeCommand 消息,设置浏览器的命令和 URL,并调用服务的 SendCommand 方法来发送消息给浏览器。 在服务端的代码中,可以实现 ChromeService 的接口,接收客户端发送的消息,并调用相应的浏览器 API 来执行浏览器相关的操作。最后,将结果封装成一个 ChromeResponse 消息,并返回给客户端。 总结起来,调用 chrome 浏览器可以通过使用 pb 的消息和服务来实现与浏览器的数据交互。使用 pb 提供的函数和接口,可以在客户端和服务端之间传递浏览器相关的命令和数据,实现功能的调用和结果的返回。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值