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
hoobyy 2019-09-22 21:11:42 +08:00 via Android
求教大佬,我这有网站有头模式时正常,无头模式时不正常,有什么办法没,这几天好头疼。
|
2
ClericPy OP |
3
neoblackcap 2019-09-22 21:36:22 +08:00
还在用 selenium 的肯定是很水的教程,万能不更新而已。selenium 各种功能限制,部署困难。最关键的是,占用资源太多,很多个版本都有内存泄露问题。
|
4
xjlnjut730 2019-09-22 21:37:16 +08:00
selenium 本身也是基于 cdp 的,所以搞爬虫用 cdp 跟 selenium 无非就是编码方式跟难度的区别。selenium 本身不是设计用来做爬虫的,比较适合用来做一些基于页面的自动化测试之类的。
|
5
jugelizi 2019-09-22 21:40:02 +08:00
selenium 基本跑几百个页面就失去响应了
难道我打开的姿势不对? 同事都是打开一次拿到结果就关掉重启 |
6
ClericPy OP @xjlnjut730
之前看分类 selenium 就是自动化测试那个方向, 刚摸 py 的时候倒是试过当爬虫, 卡的难受, 再看其他人使用才知道前端测试各种兼容性时候各种方便 @neoblackcap 原来如此, 主要是经久不衰阴魂不散地看到爬虫用 selenium... 以为有什么高权限能力是 cdp 不包含的, 以前有些扩展可以的权限 cdp 还不完整, 现在实在看不出有什么问题了... 两位大佬能看下结尾那俩问题么, 动态修改代理 ip 和 动态修改 UA 的... |
7
ClericPy OP |
8
daquandiao2 2019-09-22 23:47:01 +08:00
为啥不用 puppteer
|
9
ClericPy OP @daquandiao2 puppteer 就是套的 cdp, 所以想了解 selenium 有什么黑科技是 cdp 无法做的没有, 看了大家恢复, 似乎并没有, 现在用 selenium 写爬虫的基本上就是被几年前的那个帖子的复制者(某 sdn, 某客园, 某书...上很多营销号把旧文翻新的...) 给坑了的, 暂时是这么个结论吧...
我弄 cdp 的时候 py 版本那个 puppteer 貌似还没 release stable version, 只好自己写 |
10
neoblackcap 2019-09-23 00:27:06 +08:00 1
@xjlnjut730 selenium 是 webdriver,那是另外一套协议。你不安装对应浏览器的 webdriver 驱动根本没法控制。cdp 跟 webdriver 不是一套协议。
现在主要是谷歌更新了了 chrome 的 headless 模式,加上 cdp,能控制爬虫的精度更高了。 @ClericPy 至于代理你还是在网关之类的地方搞吧。代理价 UA 什么的都是爬虫大忌,谷歌作为一个搜索引擎,他们都是认为爬虫不应该动态改 UA 跟代理去爬不让你爬的东西。怎么可能有接口。 当然你加一个接口应该也不难,自己动手去改一个 chromium,加一个接口呗,如果你能改得动的话,加 Java Applet 检测欺骗都可以。 |
11
ClericPy OP @neoblackcap 那我动态 ua pac 什么的还是考虑扩展什么的来吧, 感谢回答
|
12
nullboy 2019-09-23 08:26:07 +08:00
@neoblackcap 部署困难? 用 docker 啊,remote driver https://github.com/SeleniumHQ/docker-selenium
功能限制怎么讲? 说内存泄漏的,多半是浏览器没关掉 |
13
nullboy 2019-09-23 08:34:36 +08:00
@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) |
14
nullboy 2019-09-23 08:36:15 +08:00
代理自己部署一个 squid,然后在 chrome_options 中指定代理
chrome_options.add_argument('--proxy-server=http://xxxxxx:4128') |
15
nullboy 2019-09-23 08:41:50 +08:00
@ClericPy 我的爬虫放在阿里云上,阿里云 ip 被网站封掉了,然后我在自己家本地搭了一个代理服务,阿里云代理到家里宽带爬取数据,还有一个定时任务,如果监控到 ip 被封,通过 shell 命令重启路由器,重新获取 ip。
另外,个人感觉,selenium 出到 3 之后比以前稳定多了。什么程序挂掉,内存泄漏啥的,自己的程序做好异常处理不就完事了。算了,不说了 |
16
neoblackcap 2019-09-23 08:46:37 +08:00 via iPhone
@nullboy 你先看看别人官方说的集群跟你讲的这些。跑久一点看看情况,当然没有问题的话,你可以继续用。
至于 ua 跟代理,你可以看看题主是怎么问的,然后你再回答。我只能说不是每个人都会觉得杀掉浏览器重启这样一个方式叫动态切换。 |
17
ClericPy OP @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 那个官方开发组的那个讨论组, 万一支持上了呢... |
18
BlackHole1 2019-09-23 10:02:39 +08:00 via Android
动态 ua 的话,不太清楚,不过 CDP 应该有相关接口吧,没有的话给 chromiun 提个 feature issue。动态代理同理,不过代理可以先代理到一个跳板机上,修改时可以改跳板机的代理,来绕过
|
19
ClericPy OP @BlackHole1 当年特地调研过, 动态 UA 偶尔有个版本还出现过一点实验室功能的苗头, 下个版本直接砍没了... 可能也是没生效
动态代理不容易弄, 你说的这个其实不如网关调控或者在代理服务器那边做更简单点, 实际上 cdp 原生支持了 pac 相关功能, 问题却出在 headless 模式里不支持 pac, 当年那个帖子找不到了, 随手找到个 2017 年的, 作者们说 feature request 需要多数人需要才会开发 https://bugs.chromium.org/p/chromium/issues/detail?id=765245 貌似更早时候提这个的也是这么个回复, 人家不想支持... |
20
neoblackcap 2019-09-23 10:33:29 +08:00 via iPhone 1
@ClericPy 我理解你的说法。说 selenium 限制多的,还有就是无法对特定资源进行封堵。
ua 跟代理我看谷歌内部的确不想搞,因为别人没这个需求。IP 有 A 段,UA 公信性好。所以我真的建议改源代码还快点。不过的确需要功力 |
21
littlespider89 2019-09-23 10:55:36 +08:00 1
echo aHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9wdXBwZXRlZXIvaXNzdWVzLzY3OCNpc3N1
ZWNvbW1lbnQtMzYxOTU3MjM0Cg== |base64 --decode 这里有讨论, 可以用 puppeteer 的 request iterception 来实现 |
22
ClericPy OP @littlespider89 忘了这招曲线救国了, cdp 里可以对 request 和 response 做很多 patch, 感谢提醒
|
23
xjlnjut730 2019-09-23 14:12:30 +08:00
@neoblackcap 你可以看下 chromedriver 的源码,是基于 cdp 实现了 webdriver 协议。
|
24
neoblackcap 2019-09-23 14:21:37 +08:00
@xjlnjut730 那也只能说 chromedriver 是那样做,geckodriver 可不是
|
25
supersu 2019-09-27 18:26:38 +08:00 via Android
动态 UA 可以了解一下 user_agents 这个库
|
26
ClericPy OP |
27
15399905591 2019-09-30 14:40:54 +08:00
使用 selenium 其实很方便,只是因为对应的 driver 太重,并且限制很多,而且现在大厂都针对各种 driver 做了防范,所以越来越难用了。现在 Puppeteer 已经越来越流行了,可以考虑下这个。
|