在运用selenium调用浏览器进行自动化运行或者爬虫采集,发现了一个问题,就是浏览器在启动运行后再关闭退出,这中间有时程序突然卡顿,一直停滞不前,这其中的卡顿问题,可能是更换ip时出现偶尔性反应延迟,导致程序卡顿,如果代码运行基本没问题,想要持续运行,就需要对程序进行监控。
对于这种情况,我的一个想法就是通过信号传递的方式,获取进程pid的持续时间,从而判断selenium自动化运行时是否卡顿。首先用案例测试一下
selenium运行文件
在test2.py文件中,打开了谷歌浏览器,并获取驱动的PID,并将驱动PID通过信号发送出去,程序正常运行结束,退出浏览器,并杀死driver进程PID
import time
from selenium import webdriver
from blinker import signal
import os
class A:
s = signal(str)
def openChrome(self):
self.driver = webdriver.Chrome()
self.driverPID = self.driver.service.process.pid
self.s.send(self.driverPID)
def kill_pid(self,pid):
self.driver.quit()
os.system('taskkill /f /pid %s' % pid)
def main(self):
self.openChrome()
time.sleep(3)
# self.kill_pid(self.driverPID)
if __name__ == '__main__':
A().main()
监控文件
在test3.py文件中,运行程序,通过信号连接,获取driver进程PID信号,并监控程序的运行状态。通过等待5分钟的时间,如果driver驱动的进程PID还是存在,说明程序卡顿了,再通过`psutil`库生成进程迭代器,并检查是否有指定driver的进程PID,然后并kill掉PID和浏览器驱动,最后再重新运行。
from test2 import A
import os
import psutil
import time
s = A().s
tid = None
@s.connect
def get_pid(tar_pid):
global tid
print('driver的进程pid为',tar_pid)
tid = tar_pid
def check():
global tid
all_pid = psutil.process_iter()
while True:
try:
pid = all_pid.__next__().pid
if pid == tid:
print('程序卡顿了,重新运行程序,并删除所有的chrome.exe')
os.system('taskkill /f /pid %s' % pid)
os.system('taskkill /f /im %s' % 'chrome.exe')
break
except:
break
def run():
A().main()
time.sleep(60*5)
check()
if __name__ == '__main__':
run()
运行结果
总结:通过blinker信号传递,获取驱动进程PID,对程序运行时间进行监控,通过固定的等待时间,超过该时间,再利用`psutil'库对驱动进程PID进行检查,如果存在,则删除浏览器进程,并重新运行。