首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
ClericPy
V2EX  ›  Python

selenium 调控 chrome 浏览器做爬虫有什么特殊功能是 cdp 做不到的吗

  •  
  •   ClericPy · 122 天前 · 2607 次点击
    这是一个创建于 122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    peace & love, 不是引战, 提问为主

    2013 年就看到用 selenium 搞爬虫的例子
    
    那个年代 phantomjs 作者还没放弃, 各种 driver 也算不错
    
    然后 chrome/chronium 忘了哪个版本出来, 原生支持 remote debug 功能 (参见 CDP 官方文档, chrome devtools protocol), firefox 也支持着, 就有点不明白 selenium 做爬虫有什么特别好的地方, 之前一直以为它就是个做测试用的
    
    cdp 刚出不久接到任务搞过相关爬虫, 虽然各种 socket 把我绕的晕了一段时间, 调度一堆进程实例也好多僵尸进程孤儿进程以及忘记 close fds...
    
    不过切身使用过以后, 不论性能 /兼容性 /CPU 内存使用率都更舒服的多, 2CPU 8GB 机器开 40 多 headless 实例才用了一半多资源, 每个实例还可以开很多 tab (之所以不全在一个实例里开 tab, 还是那个浏览器禁止对同一个域名发起太多连接的梗)
    

    所以有点想知道 selenium 被用做爬虫到底还有什么特别有优势的地方

    PS: 已经启动的 chrome 进程, 怎么动态修改代理 ip 和 user-agent, 早年间 headless 模式下不支持 pac-file, 也没找到什么好方法动态改 pac 的方式, 然后 user-agent 也不知道怎么像 chrome 插件那样动态更改, proxy 和 UA 都是启动时参数搞的

    第 1 条附言  ·  122 天前
    附上 cdp 地址

    https://chromedevtools.github.io/devtools-protocol/

    最常用的还是 Network 和 Page 部分, 很多高级权限当初写扩展的时候就用的很爽, 简单的通过 websocket 和 http 请求就能 debug 浏览器, 又轻量又舒服

    麻烦回帖的大佬可以顺路分享下动态修改 IP 和 UA 的方法, 实在不行我就装扩展解决了...
    第 2 条附言  ·  117 天前
    已经结帖了

    selenium 写爬虫至少在功能方面和 cdp 重合度很高, 而且好像也支持上和 cdp 通信, 所以就独特权限 /特殊功能等角度看, 并没有超出 cdp 什么, 反而还有一些 issue 遗留不太适合做爬虫, 不过做前端的自动化测试来说还是方便太多

    chronium 开发团队本着 "你并不是真的特别需要" 原则, 没有动态 UA 和 动态挂代理的开发意向, 其实 3 年前就看到了, 没想到还是不打算搞
    所以在 "非 headless" 情况下, 可以通过代理扩展, 或者 pac 文件, 来搞定动态代理的问题; 在 headless 的模式, 那就只好从 upstream 角度搞了, 甚至挂上 mitmproxy 也行吧

    动态 UA 同上, 扩展搞吧...

    另: V 友还提到了个直接在 request 层面改 headers, 也可以的

    结帖了, 咱就不回复了吧~

    ps: 怎么这么多收藏不回帖的, 这帖子没什么信息量吧...
    27 回复  |  直到 2019-09-30 14:40:54 +08:00
    hoobyy
        1
    hoobyy   122 天前 via Android
    求教大佬,我这有网站有头模式时正常,无头模式时不正常,有什么办法没,这几天好头疼。
    ClericPy
        2
    ClericPy   122 天前
    @hoobyy 不是大佬... 新手小菜鸟一只

    可能性太多了啊, 得对症下药
    比如有可能 webdriver 被搞了, 也可能 headless 有东西没渲染, 盲猜实在没的想...
    neoblackcap
        3
    neoblackcap   122 天前
    还在用 selenium 的肯定是很水的教程,万能不更新而已。selenium 各种功能限制,部署困难。最关键的是,占用资源太多,很多个版本都有内存泄露问题。
    xjlnjut730
        4
    xjlnjut730   122 天前
    selenium 本身也是基于 cdp 的,所以搞爬虫用 cdp 跟 selenium 无非就是编码方式跟难度的区别。selenium 本身不是设计用来做爬虫的,比较适合用来做一些基于页面的自动化测试之类的。
    jugelizi
        5
    jugelizi   122 天前
    selenium 基本跑几百个页面就失去响应了
    难道我打开的姿势不对?
    同事都是打开一次拿到结果就关掉重启
    ClericPy
        6
    ClericPy   122 天前
    @xjlnjut730
    之前看分类 selenium 就是自动化测试那个方向, 刚摸 py 的时候倒是试过当爬虫, 卡的难受, 再看其他人使用才知道前端测试各种兼容性时候各种方便

    @neoblackcap
    原来如此, 主要是经久不衰阴魂不散地看到爬虫用 selenium... 以为有什么高权限能力是 cdp 不包含的, 以前有些扩展可以的权限 cdp 还不完整, 现在实在看不出有什么问题了...

    两位大佬能看下结尾那俩问题么, 动态修改代理 ip 和 动态修改 UA 的...
    ClericPy
        7
    ClericPy   122 天前
    @jugelizi
    2013 年左右我启动一个实例都不敢开太久, 内存不知道是漏了还是怎么的, biu biu 的涨, 后来用 ghost.py 基本上并发操作几次就死机...
    你几百个 tab 是并发的还是单线程一个个打开的, 我 8 GB 内存一个浏览器实例开 50 多个就要爆炸了, CPU 炸了...
    daquandiao2
        8
    daquandiao2   122 天前
    为啥不用 puppteer
    ClericPy
        9
    ClericPy   122 天前
    @daquandiao2 puppteer 就是套的 cdp, 所以想了解 selenium 有什么黑科技是 cdp 无法做的没有, 看了大家恢复, 似乎并没有, 现在用 selenium 写爬虫的基本上就是被几年前的那个帖子的复制者(某 sdn, 某客园, 某书...上很多营销号把旧文翻新的...) 给坑了的, 暂时是这么个结论吧...

    我弄 cdp 的时候 py 版本那个 puppteer 貌似还没 release stable version, 只好自己写
    neoblackcap
        10
    neoblackcap   122 天前   ♥ 1
    @xjlnjut730 selenium 是 webdriver,那是另外一套协议。你不安装对应浏览器的 webdriver 驱动根本没法控制。cdp 跟 webdriver 不是一套协议。
    现在主要是谷歌更新了了 chrome 的 headless 模式,加上 cdp,能控制爬虫的精度更高了。

    @ClericPy 至于代理你还是在网关之类的地方搞吧。代理价 UA 什么的都是爬虫大忌,谷歌作为一个搜索引擎,他们都是认为爬虫不应该动态改 UA 跟代理去爬不让你爬的东西。怎么可能有接口。
    当然你加一个接口应该也不难,自己动手去改一个 chromium,加一个接口呗,如果你能改得动的话,加 Java Applet 检测欺骗都可以。
    ClericPy
        11
    ClericPy   122 天前
    @neoblackcap 那我动态 ua pac 什么的还是考虑扩展什么的来吧, 感谢回答
    nullboy
        12
    nullboy   122 天前
    @neoblackcap 部署困难? 用 docker 啊,remote driver https://github.com/SeleniumHQ/docker-selenium
    功能限制怎么讲?

    说内存泄漏的,多半是浏览器没关掉
    nullboy
        13
    nullboy   122 天前
    @neoblackcap 无法修改 UA??????????
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36")
    driver = webdriver.Chrome(options=chrome_options)
    nullboy
        14
    nullboy   122 天前
    代理自己部署一个 squid,然后在 chrome_options 中指定代理
    chrome_options.add_argument('--proxy-server=http://xxxxxx:4128')
    nullboy
        15
    nullboy   122 天前
    @ClericPy 我的爬虫放在阿里云上,阿里云 ip 被网站封掉了,然后我在自己家本地搭了一个代理服务,阿里云代理到家里宽带爬取数据,还有一个定时任务,如果监控到 ip 被封,通过 shell 命令重启路由器,重新获取 ip。
    另外,个人感觉,selenium 出到 3 之后比以前稳定多了。什么程序挂掉,内存泄漏啥的,自己的程序做好异常处理不就完事了。算了,不说了
    neoblackcap
        16
    neoblackcap   122 天前 via iPhone
    @nullboy 你先看看别人官方说的集群跟你讲的这些。跑久一点看看情况,当然没有问题的话,你可以继续用。

    至于 ua 跟代理,你可以看看题主是怎么问的,然后你再回答。我只能说不是每个人都会觉得杀掉浏览器重启这样一个方式叫动态切换。
    ClericPy
        17
    ClericPy   122 天前
    @nullboy
    这位老哥稍安勿躁
    部署困难是早年的问题, 不过主要还是资源利用率以及实例稳定性方面差强人意, 那年代内存泄漏有时候遇到僵尸进程了, 父进程杀死以后子进程也有可能突然孤儿进程挂在 init 进程上, 现在 selenium 有没有 fix 那些问题也较久没用不做评论
    修改 UA 和 proxy 在顶楼可能写的有点模糊, 顶楼上说的是在启动参数里可以自定义, 然而已经启动的 Chrome 实例不知道有没有办法动态切换而不重启实例, 就像 Proxy SwitchyOmega 和 User-Agent Switcher for Chrome

    挂代理那边看了下, 最简单的部署还是网关那边操作, 或者说全局通用一个代理, 在代理服务器那里动态调试, 现在也不知道 headless 模式到底有没有支持上 pac file, 之前在 chronium 开发组那边的帖子倒是不少人问这个问题

    selenium 后期貌似是 fix 了很多 issue, 只不过本帖主要的问题其实还是:
    selenium 实现了什么功能是原生 Chrome devtools protocol 里无法做到的
    后续补问的动态修改那俩也是对上述问题的补充, 即: 已启动的 Chrome 进程想动态修改 ip 和 UA 如果用 selenium 是否可以做到
    毕竟现在版本的 selenium 也只支持了 cdp 调用了的, 某些角度看前者也算后者一个超集

    @neoblackcap
    动态切换的那俩问题是额外补充问的, 当时觉得 selenium 更新了这么多年, 万一有办法实现呢, 或者说 cdp 也这么多年了, 我也没太关注 chronium 那个官方开发组的那个讨论组, 万一支持上了呢...
    BlackHole1
        18
    BlackHole1   122 天前 via Android
    动态 ua 的话,不太清楚,不过 CDP 应该有相关接口吧,没有的话给 chromiun 提个 feature issue。动态代理同理,不过代理可以先代理到一个跳板机上,修改时可以改跳板机的代理,来绕过
    ClericPy
        19
    ClericPy   122 天前
    @BlackHole1 当年特地调研过, 动态 UA 偶尔有个版本还出现过一点实验室功能的苗头, 下个版本直接砍没了... 可能也是没生效
    动态代理不容易弄, 你说的这个其实不如网关调控或者在代理服务器那边做更简单点, 实际上 cdp 原生支持了 pac 相关功能, 问题却出在 headless 模式里不支持 pac, 当年那个帖子找不到了, 随手找到个 2017 年的, 作者们说 feature request 需要多数人需要才会开发 https://bugs.chromium.org/p/chromium/issues/detail?id=765245 貌似更早时候提这个的也是这么个回复, 人家不想支持...
    neoblackcap
        20
    neoblackcap   122 天前 via iPhone   ♥ 1
    @ClericPy 我理解你的说法。说 selenium 限制多的,还有就是无法对特定资源进行封堵。
    ua 跟代理我看谷歌内部的确不想搞,因为别人没这个需求。IP 有 A 段,UA 公信性好。所以我真的建议改源代码还快点。不过的确需要功力
    littlespider89
        21
    littlespider89   122 天前   ♥ 1
    echo aHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9wdXBwZXRlZXIvaXNzdWVzLzY3OCNpc3N1
    ZWNvbW1lbnQtMzYxOTU3MjM0Cg== |base64 --decode
    这里有讨论, 可以用 puppeteer 的 request iterception 来实现
    ClericPy
        22
    ClericPy   122 天前
    @littlespider89 忘了这招曲线救国了, cdp 里可以对 request 和 response 做很多 patch, 感谢提醒
    xjlnjut730
        23
    xjlnjut730   122 天前
    @neoblackcap 你可以看下 chromedriver 的源码,是基于 cdp 实现了 webdriver 协议。
    neoblackcap
        24
    neoblackcap   122 天前
    @xjlnjut730 那也只能说 chromedriver 是那样做,geckodriver 可不是
    supersu
        25
    supersu   117 天前 via Android
    动态 UA 可以了解一下 user_agents 这个库
    ClericPy
        26
    ClericPy   117 天前
    @supersu 还真有这么个库...... 不过你确定能搞到 cdp 里去?

    已经结贴了, 没有锁定功能, 我在 append 里提一下吧...
    15399905591
        27
    15399905591   114 天前
    使用 selenium 其实很方便,只是因为对应的 driver 太重,并且限制很多,而且现在大厂都针对各种 driver 做了防范,所以越来越难用了。现在 Puppeteer 已经越来越流行了,可以考虑下这个。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2028 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 06:36 · PVG 14:36 · LAX 22:36 · JFK 01:36
    ♥ Do have faith in what you're doing.