DrissionPage 是我一个人开发了几年的开源项目,现在 GitHub 上获得 3.8K 星,gitee 上 3.5 星,并且获得了 gitee 的 GPV 项目。
项目地址:https://gitee.com/g1879/DrissionPage 项目文档:https://g1879.gitee.io/drissionpagedocs
DrissionPage 是一个基于 python 的网页自动化工具。
它既能控制浏览器,也能收发数据包,还能把两者合而为一。
可兼顾浏览器自动化的便利性和 requests 的高效率。
它功能强大,内置无数人性化设计和便捷功能。
它的语法简洁而优雅,代码量少,对新手友好。
本库采用全自研的内核,内置很多实用功能,对常用功能作了整合和优化,对比 selenium ,有以下优点:
无 webdriver 特征
无需为不同版本的浏览器下载不同的驱动
运行速度更快
可以跨<iframe>
查找元素,无需切入切出
把<iframe>
看作普通元素,获取后可直接在其中查找元素,逻辑更清晰
可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,无需切换
可以直接读取浏览器缓存来保存图片,无需用 GUI 点击另存
可以对整个网页截图,包括视口外的部分( 90 以上版本浏览器支持)
可处理非open
状态的 shadow-root
除了以上优点,本库还内置了无数人性化设计。
极简的语法规则。集成大量常用功能,代码更优雅
定位元素更加容易,功能更强大稳定
无处不在的等待和自动重试功能。使不稳定的网络变得易于控制,程序更稳定,编写更省心
提供强大的下载工具。操作浏览器时也能享受快捷可靠的下载功能
允许反复使用已经打开的浏览器。无须每次运行从头启动浏览器,调试超方便
使用 ini 文件保存常用配置,自动调用,提供便捷的设置,远离繁杂的配置项
内置 lxml 作为解析引擎,解析速度成几个数量级提升
使用 POM 模式封装,可直接用于测试,便于扩展
高度集成的便利功能,从每个细节中体现
还有很多细节,这里不一一列举,欢迎实际使用中体验:)
1
southcat996 294 天前
之前公司项目写电商爬虫的时候就是用的这个框架,体验非常好
|
2
equationzhao 294 天前
👍 厉害哦
|
3
JiangBeta 294 天前 via Android
大哥,你换代理这个功能快上啊,等了大半年了
|
4
gzlock 294 天前
功能似乎跟 puppeteer Playwright 有挺多重复的?
|
5
cxumol 294 天前 via Android
google colab 环境下启动不了
|
6
wjx0912 294 天前
文字描述太多了,不如发几张 screenshot
|
8
mumuuu 294 天前
这个文字介绍,一股假大空的味,先把自己吹的多 nb ,细看一下发现和一些换皮游戏差不多的
|
9
testliyu 294 天前
在 github 的 trending 上见过这个项目,可以的没想到在这遇见作者了
|
11
tikazyq 294 天前 1
支持一个,如果能加入工程化的项目,例如 Selenium Grid 就更好了
|
12
yuyuyu6668 294 天前
能否手动打开网页 登录 , 然后再用 DrissionPage 控制网页?
|
13
qYs9wxnXG96c6z1t 293 天前 via iPhone
记得阮老师的周刊里推荐过,我也用过一次,觉得很是不错,已 star
|
14
x2ve 293 天前
试用了下,比那个 selenium 好用;但是感觉使用文档还差了点,我想了解如何持续的监测网页中的`心跳 API`,利用监听网络数据的实时获取只能获取第一次的
|
16
g1879 OP |
19
ic3z 292 天前 via iPhone
很强。
|
20
lann 292 天前
刚刚用这个框架搞定了几个站点的数据采集,相当好用,感谢作者!
|
21
x2ve 292 天前
@g1879 #17 非常感谢,开始就使用了 page.listen.steps(),只是没注意自己的 api 接口地址一直变化,导致只抓取到了首次的地址,目前已正常采集
|
22
RangerWolf 292 天前
问一下,能远程控制吗? 比如一个 leader + n 个 worker ,每个 worker 配置 1 个实际工作的实例
|
23
g1879 OP @RangerWolf 我没有这个需求没有试过,群里好像有人这样用。
|
25
LeeReamond 287 天前
别的都没啥问题,问题是我没有 gitee 账号,注册账号还要绑手机号的代码托管服务?
|
26
GeekGao 285 天前
很好很强大。
|
27
LeeReamond 283 天前
@g1879 试用了一下还不错,尤其是不需要 chromedriver 这点非常好,但是现在有个痛点。
目前引擎的所有代码在 alert 弹出后都会阻塞,无法在用户层对于 alert 事件做任何处理,只能设置为自动确认才能让代码自动执行。 如果 alert 内部含有有效信息的话则完全无法获取。 是否可以参考 selenium 将 alert 设计成异常的形式,用户让可以对中断进行处理。 |
28
g1879 OP @LeeReamond 用 handle_alert(),是可以处理的,不一定自动确认,accept 参数设为 None ,只获取 alert 文本不进行处理,然后再调用一次 handle_alert()处理就行。handle_alert()会自动等待 alert 出现再处理。
另外,还有 next_one 参数,用来处理下一次出现的 alert ,主要是处理页面跳转时触发的 alert 。 |
29
LeeReamond 283 天前
@g1879 最主要是有阻塞的问题,因为网站弹窗不一定是在预期时候出现的,你这么搞不确定什么时候自己代码就阻塞住了,所以最合适的就是上报异常。如果按你说的在跳转页面前使用 next_one 预设下个页面会弹窗,但是用户无法确定网页运行到什么状态才会弹窗,这就导致虽然能捕获弹窗数据,但是用户代码里感知不到什么位置出现弹窗了。
另外还有个问题是,全局等待,像 selenium 有个隐式等待(就是页面所需所有资源加载完毕)的 api ,我看你的文档里只有一个 start_load 和一个 doc_loaded ,是不是都不太对 |
30
g1879 OP @LeeReamond 不是全局等待,这个一两句说不太清楚,你先了解了解。我的等待方式比 selenium 好。比如说,selenium 的等待只能以最长的等待设置为准,我的可以用短的覆盖长的等待时间,有很多情况都灵活得多。
至于 alert ,我不理解你的意思。一般做自动化都先把网站行为摸透,知道什么时候会出现 alert 吧,不一定出现的,设个短的 timeout 就行了。 |
31
LeeReamond 282 天前
@g1879 虽然我不是做专业爬虫工作的,但你这个设计思路那不是往增加开发人员心智负担上使劲。。。因为业务的复杂度是无限的,网站为了给自动爬取增加不适会用各种办法,如果用异常上报的方式,开发人员只需要规定在某个时期内出现异常那么就重新开始流程这样。但是如果你要求把行为摸透,那只有两种可能,要不然就是网站行为太单纯,要不然就是极大增加开发人员心智负担,打上无数的状态控制。说到底最关键原因还是 alert 会阻塞用户代码,你没法用常规的流程控制手段去控制它。
再者我想知道 chromnium 实现精准控制状态,还要保证爬虫速度,这得多花多少经历来进行流程控制,另外还要假设对方网站不会频繁更新,否则你无法写一个大略的状态控制来增加鲁棒性。我很高兴你这个框架可以不用像 selenium 一样隔一段时间还要更换 chromedriver ,但是你现在提供的功能我代码迁移不过去 |
32
g1879 OP @LeeReamond 不太明白,你意思是增加一个设置,接收到 alert 就抛出异常?
|
33
LeeReamond 282 天前
@g1879 起码 selenium 是这样处理的。我试着把在跑的几个脚本往你这个迁移,主要问题就是 alert 。目前的几个典型场景需要解决方案:
1.网站没有严格反爬,但也不会让自动脚本太舒服,alert 行为不是很可控,会随机弹。 2.在没有严格流程控制的情况下不让弹窗阻塞脚本( selenium 的方案是在上级 catch 异常即可,所以我可以很粗糙地开发但仍然保持对流程的高度控制)。 3. 服务器对验证码的判断结果由 alert 返回。这个场景的问题是,验证码 cv 识别有成功率,handle 不能撤回只能依赖 timeout 和等待让代码健壮性变成依托。 以上这些场景都是 trycatch 非常合适的应用场景,你不知道流程会在脚本执行到哪步时触发异常行为,但是因为有异常直接 catch 所以整体流程依然可控。现在没有办法 catch 的原因是弹窗后整个被阻塞,即使尝试用 next_one 预埋 handler ,因为你是单线程同步脚本,又没有个回调,这该怎么控制。 |
34
g1879 OP @LeeReamond 你用的是哪个版本?新版出现 alert 是没有阻塞的,alert 存在也会向后执行,但如果这个时候调用设计 js 的操作,才会抛出 AlertExistsError 。你的代码给我看看?
|
35
ZnductR0MjHvjRQ3 281 天前
大佬 是否支持 带账号密码的代理 IP ? 以及无痕模式/隔离?
|
36
forsky 281 天前
编程新人, 这是我 pip 安装的第一个包。 很好用,还在学习中
|
37
ZnductR0MjHvjRQ3 280 天前
仔细看了一下文档 确实牛逼
说真的大佬 就光说文档这块 都比 翻起来巨恶心的 selenium 强了很多了 并且我仔细看了一下 4.0 功能确实也很全了,做大部分自动化的东西也已经够用了 目前手里的一个项目就需要用到自动化浏览器的功能,后面我尝试用一下看 |
38
LeeReamond 280 天前
@g1879 最近一周内安装的版本。你指的没有阻塞是设置了 autoaccept 或者 nextone 的情况下没有阻塞吧,普通的出现弹窗事件->处理弹窗事件的逻辑是阻塞的。
https://gist.github.com/RedmondLee/ec0c13215c97c9902cd8c12ecbfbca1c |
39
g1879 OP @LeeReamond 如果接管前 alert 就存在,是没有办法接管的。
|
40
LeeReamond 277 天前
@g1879 上面说了半天了,你指的没有阻塞是设置了 autoaccept 或者 nextone 的情况,而无法实现对弹窗的发现后处理。
|
41
g1879 OP @LeeReamond 不是,无论是否设置都不阻塞。但是无论是否设置也都不能在 alert 出现后接管浏览器。
如果 alert 在程序接管前出现,才会阻塞。 |
42
LeeReamond 276 天前
@g1879 你应该加入一个选项,比如起码在 autoaccept 的同时 raiseException ,让用户代码可以管理中断
|
44
chinesehuazhou 269 天前
不错,收录到我的 Python 潮流周刊
|
45
mykaii 261 天前
之前用过几次,支持,就是文档不太友好
|
46
jettzhang 238 天前
试用一下先,感谢大佬
|
47
jettzhang 234 天前
正在使用,真香,希望可以加入设置浏览器指纹和代理 IP
|
48
lengdandan 194 天前
@g1879 很惊艳,本来使用的 Playwright ,目标网站识别机器人。换成 drissionpage 完美过了。
|
49
werwer 93 天前
大佬好久没在这里冒泡了,应该是有事情要忙吧,祝一切顺利
|