爬虫采用Selenium + geckodriver(Firefox webdriver),经过调试,发现访问一些网站结束后,调用webdriver.quit()函数时,代码直接hang住,无法返回及异常发生。
参考文档后面的资料,是由于Firefox退出时,有需要用户确认的确认框引起的。
按照Selenium的工作机制,代码调用Selenium Client Library,向webdriver发送HTTP连接发送 JSON Wire Protocol数据,然后webdriver向Firefox发送HTTP数据。现在Firefox因为需要用户确认,一直没有回复,然后webdriver也无法向Selenium Client Library返回数据,最关键的是这中间HTTP请求没有超时机制,导致quit()函数一直无法结束返回。
根据参考文档,结合以下几种办法一起解决。
-
配置Firefox,关闭确认弹出框选项。具体就是在firefox地址栏中输入about:config, 修改以下三项的值。然后创建webdriver.Firefox()时导入配置文件。
browser.tabs.warnOnClose = false browser.tabs.warnOnCloseOtherTabs = false dom.disable_beforeunload = true
-
代码屏蔽onunload与onbeforeunload事件
browser.execute_script("window.onunload=null; window.onbeforeunload=null")
- 设置socket全局默认超时