V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lasuar
V2EX  ›  Python

Python -selenium 控制 chrome 遇到浏览器卡顿并卡住整个程序

  •  
  •   lasuar · 2020-01-20 09:15:16 +08:00 · 7106 次点击
    这是一个创建于 1529 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用了 selenium 有好久了,卡住之后,连程序都停滞了,就像时间停止了一样,没有任何日志。。
    这个问题一直没当回事,每次都是起多个浏览器,某个卡住了还有别的在工作,过了许久它又恢复了,查了下说是 chrome 的原因,使用别的浏览器说没有这个问题(未尝试),想来咨询下各位 zs 爬友~,现实中要找到 zs 爬友太难了,v 站真是个好地方~~感谢感谢

    第 1 条附言  ·  2020-01-20 11:55:29 +08:00
    小结:由于楼主使用 chrome 已经习惯了,相关的特性换到其他浏览器不一定支持,比如支持非阻塞加载这个特性用 phantomJs 就不行(官网也没找到相应描述),遂决定采用 v 友的 kill 进程建议。
    第 2 条附言  ·  2020-01-20 13:06:10 +08:00
    不看不知道,一看吓一跳,chromedriver 的进程居然有那么多,每启动一次浏览器,chromedriver 都会有一个进程,而关闭浏览器时,chromedriver 并不会随之关闭。
    第 3 条附言  ·  2020-01-20 13:07:43 +08:00
    chromedriver 在 win10 上占用的内存是 10M 左右,长期运行 selenium 内存泄露的原因之一想必来自于此了。
    17 条回复    2020-01-22 17:42:14 +08:00
    lasuar
        1
    lasuar  
    OP
       2020-01-20 09:17:04 +08:00
    别的浏览器如 firefox、phantomjs
    lasuar
        2
    lasuar  
    OP
       2020-01-20 09:18:23 +08:00
    比如等待某个元素最多 30s,卡住的表现就是它能等一天
    SjwNo1
        3
    SjwNo1  
       2020-01-20 09:25:34 +08:00
    那就先尝试一下别的浏览器
    shiran3f
        4
    shiran3f  
       2020-01-20 09:25:35 +08:00
    我的处理方式很暴力,定时 kill 所有相关进程...你会发现 chrome 开了一堆进程。
    wzwwzw
        5
    wzwwzw  
       2020-01-20 09:55:31 +08:00
    @shiran3f +1 我也是这样子处理的,每个任务周期结束之后杀掉所有 chrome 的进程,还有 chromedrvier 的进程,如果不涉及到复杂操作可以用 splash。
    sxd96
        6
    sxd96  
       2020-01-20 09:57:17 +08:00 via iPhone
    selenium 不是专门做爬虫的,长时间跑确实会有问题。只能定时 kill 重启。

    另外,可以试试 puppeteer
    retanoj
        7
    retanoj  
       2020-01-20 10:25:57 +08:00
    @shiran3f
    定期 kill 进程+1
    lasuar
        8
    lasuar  
    OP
       2020-01-20 10:33:54 +08:00
    @shiran3f 我先尝试别的浏览器试试
    @sxd96 puppeteer 不也是控制 chrome 的吗
    lasuar
        9
    lasuar  
    OP
       2020-01-20 11:56:25 +08:00
    @shiran3f 好的谢谢,请问下如何准确找到爬虫启动的 chrome 进程呢
    lasuar
        10
    lasuar  
    OP
       2020-01-20 11:56:44 +08:00
    @wzwwzw 好的谢谢,请问下如何准确找到爬虫启动的 chrome 进程呢
    wzwwzw
        11
    wzwwzw  
       2020-01-20 12:12:05 +08:00
    @lasuar 直接全部杀死呗,可以用 docker 或者用虚拟机运行爬虫,这样子最省事。
    lasuar
        12
    lasuar  
    OP
       2020-01-20 12:28:44 +08:00
    @wzwwzw ok
    andylsr
        13
    andylsr  
       2020-01-20 12:38:09 +08:00
    卡住是怎么个卡法, 我一般会尝试 reflush, 如果确实进程死了那就只能 kill 了, 启动时获取一下系统进程列表, 启动后再获取一下, 一对比就知道启动了哪些 chrome, 如果问题经常会碰到那就先做个测试, 定期重启一下, 或者再写个小脚本做监测?
    shiran3f
        14
    shiran3f  
       2020-01-20 12:45:36 +08:00
    @lasuar #8 用 @wzwwzw #11 的方法是最省事了,我是记录每次启动后 chrome、seleium、chromedirver,Xvbf 的进程号。因为我是以一次任务启动一次,前后对比来看是否 kill 干净。
    soho176
        15
    soho176  
       2020-01-20 13:56:47 +08:00
    用 firefox,我用 chrome 总出问题,换成了 firefox 好了
    guochao
        16
    guochao  
       2020-01-22 10:06:53 +08:00
    这种进程不退出的问题可以尝试下 linux 的 systemd 或者直接 cgroup,或者 docker。docker 下面就是得把沙箱关掉,麻烦一些。

    我们开发环境和生产都是 Fedora/CentOS,开着 SELinux。用的是 puppeteer。遇到的问题是这样,有的时候 chromium 本身父进程会崩溃,或者 blink 的渲染进程 bug 阻塞了通信导致 timeout,最后无法正确关闭。解决办法就是利用 cgroup 记录 pid,顺便限制一下资源占用,退出时一次性把这个 cgroup 下所有 pid 杀死。

    chrome 的 devtools 协议的话,还可以尝试一下 node 的 puppeteer 和 golang 的 chromedp,都是直接启动 chrome/chromium 不需要 chromedriver 的
    lasuar
        17
    lasuar  
    OP
       2020-01-22 17:42:14 +08:00
    @guochao 好的,感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1010 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:57 · PVG 03:57 · LAX 12:57 · JFK 15:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.