安利一个自己的开源项目: DrissionPage - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
g1879

安利一个自己的开源项目: DrissionPage

  •  
  •   g1879 Feb 6, 2024 7769 views
    This topic created in 810 days ago, the information mentioned may be changed or developed.

    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 模式封装,可直接用于测试,便于扩展

    • 高度集成的便利功能,从每个细节中体现

    • 还有很多细节,这里不一一列举,欢迎实际使用中体验:)

    51 replies    2025-03-12 18:33:00 +08:00
    southcat996
        1
    southcat996  
       Feb 6, 2024
    之前公司项目写电商爬虫的时候就是用的这个框架,体验非常好
    equationzhao
        2
    equationzhao  
       Feb 7, 2024
    厉害哦
    JiangBeta
        3
    JiangBeta  
       Feb 7, 2024 via Android
    大哥,你换代理这个功能快上啊,等了大半年了
    gzlock
        4
    gzlock  
       Feb 7, 2024
    功能似乎跟 puppeteer Playwright 有挺多重复的?
    cxumol
        5
    cxumol  
       Feb 7, 2024 via Android
    google colab 环境下启动不了
    datadump
        6
    datadump  
       Feb 7, 2024
    文字描述太多了,不如发几张 screenshot
    g1879
        7
    g1879  
    OP
       Feb 7, 2024
    @JiangBeta 我自己不需要用代理,所以一直懒得搞,过完年再研究研究。
    mumuuu
        8
    mumuuu  
       Feb 7, 2024
    这个文字介绍,一股假大空的味,先把自己吹的多 nb ,细看一下发现和一些换皮游戏差不多的
    testliyu
        9
    testliyu  
       Feb 7, 2024
    在 github 的 trending 上见过这个项目,可以的没想到在这遇见作者了
    wang93wei
        10
    wang93wei  
       Feb 7, 2024
    @mumuuu 我觉得你完全可以列一下你觉得假大空的点,至少我用了一阵子发现很实用。
    tikazyq
        11
    tikazyq  
       Feb 7, 2024   1
    支持一个,如果能加入工程化的项目,例如 Selenium Grid 就更好了
    yuyuyu6668
        12
    yuyuyu6668  
       Feb 7, 2024
    能否手动打开网页 登录 , 然后再用 DrissionPage 控制网页?
    qYs9wxnXG96c6z1t
        13
    qYs9wxnXG96c6z1t  
       Feb 8, 2024 via iPhone
    记得阮老师的周刊里推荐过,我也用过一次,觉得很是不错,已 star
    x2ve
        14
    x2ve  
       Feb 8, 2024
    试用了下,比那个 selenium 好用;但是感觉使用文档还差了点,我想了解如何持续的监测网页中的`心跳 API`,利用监听网络数据的实时获取只能获取第一次的
    g1879
        15
    g1879  
    OP
       Feb 8, 2024
    @ShihanW 谢谢!
    g1879
        17
    g1879  
    OP
       Feb 8, 2024   1
    @x2ve 试试 page.listen.steps()
    JiangBeta
        18
    JiangBeta  
       Feb 8, 2024 via Android
    @g1879 加油,看好你哦!
    ic3z
        19
    ic3z  
       Feb 8, 2024 via iPhone
    很强。
    lann
        20
    lann  
       Feb 9, 2024
    刚刚用这个框架搞定了几个站点的数据采集,相当好用,感谢作者!
    x2ve
        21
    x2ve  
       Feb 9, 2024
    @g1879 #17 非常感谢,开始就使用了 page.listen.steps(),只是没注意自己的 api 接口地址一直变化,导致只抓取到了首次的地址,目前已正常采集
    RangerWolf
        22
    RangerWolf  
       Feb 9, 2024
    问一下,能远程控制吗? 比如一个 leader + n 个 worker ,每个 worker 配置 1 个实际工作的实例
    g1879
        23
    g1879  
    OP
       Feb 9, 2024
    @RangerWolf 我没有这个需求没有试过,群里好像有人这样用。
    fdghjk
        24
    fdghjk  
       Feb 10, 2024
    @g1879 #7 换代理是必须要用的
    LeeReamond
        25
    LeeReamond  
       Feb 14, 2024
    别的都没啥问题,问题是我没有 gitee 账号,注册账号还要绑手机号的代码托管服务?
    R4rvZ6agNVWr56V0
        26
    R4rvZ6agNVWr56V0  
       Feb 16, 2024
    很好很强大。
    LeeReamond
        27
    LeeReamond  
       Feb 17, 2024
    @g1879 试用了一下还不错,尤其是不需要 chromedriver 这点非常好,但是现在有个痛点。

    目前引擎的所有代码在 alert 弹出后都会阻塞,无法在用户层对于 alert 事件做任何处理,只能设置为自动确认才能让代码自动执行。

    如果 alert 内部含有有效信息的话则完全无法获取。

    是否可以参考 selenium 将 alert 设计成异常的形式,用户让可以对中断进行处理。
    g1879
        28
    g1879  
    OP
       Feb 18, 2024
    @LeeReamond 用 handle_alert(),是可以处理的,不一定自动确认,accept 参数设为 None ,只获取 alert 文本不进行处理,然后再调用一次 handle_alert()处理就行。handle_alert()会自动等待 alert 出现再处理。
    另外,还有 next_one 参数,用来处理下一次出现的 alert ,主要是处理页面跳转时触发的 alert 。
    LeeReamond
        29
    LeeReamond  
       Feb 18, 2024
    @g1879 最主要是有阻塞的问题,因为网站弹窗不一定是在预期时候出现的,你这么搞不确定什么时候自己代码就阻塞住了,所以最合适的就是上报异常。如果按你说的在跳转页面前使用 next_one 预设下个页面会弹窗,但是用户无法确定网页运行到什么状态才会弹窗,这就导致虽然能捕获弹窗数据,但是用户代码里感知不到什么位置出现弹窗了。

    另外还有个问题是,全局等待,像 selenium 有个隐式等待(就是页面所需所有资源加载完毕)的 api ,我看你的文档里只有一个 start_load 和一个 doc_loaded ,是不是都不太对
    g1879
        30
    g1879  
    OP
       Feb 18, 2024
    @LeeReamond 不是全局等待,这个一两句说不太清楚,你先了解了解。我的等待方式比 selenium 好。比如说,selenium 的等待只能以最长的等待设置为准,我的可以用短的覆盖长的等待时间,有很多情况都灵活得多。
    至于 alert ,我不理解你的意思。一般做自动化都先把网站行为摸透,知道什么时候会出现 alert 吧,不一定出现的,设个短的 timeout 就行了。
    LeeReamond
        31
    LeeReamond  
       Feb 19, 2024
    @g1879 虽然我不是做专业爬虫工作的,但你这个设计思路那不是往增加开发人员心智负担上使劲。。。因为业务的复杂度是无限的,网站为了给自动爬取增加不适会用各种办法,如果用异常上报的方式,开发人员只需要规定在某个时期内出现异常那么就重新开始流程这样。但是如果你要求把行为摸透,那只有两种可能,要不然就是网站行为太单纯,要不然就是极大增加开发人员心智负担,打上无数的状态控制。说到底最关键原因还是 alert 会阻塞用户代码,你没法用常规的流程控制手段去控制它。

    再者我想知道 chromnium 实现精准控制状态,还要保证爬虫速度,这得多花多少经历来进行流程控制,另外还要假设对方网站不会频繁更新,否则你无法写一个大略的状态控制来增加鲁棒性。我很高兴你这个框架可以不用像 selenium 一样隔一段时间还要更换 chromedriver ,但是你现在提供的功能我代码迁移不过去
    g1879
        32
    g1879  
    OP
       Feb 19, 2024
    @LeeReamond 不太明白,你意思是增加一个设置,接收到 alert 就抛出异常?
    LeeReamond
        33
    LeeReamond  
       Feb 19, 2024
    @g1879 起码 selenium 是这样处理的。我试着把在跑的几个脚本往你这个迁移,主要问题就是 alert 。目前的几个典型场景需要解决方案:

    1.网站没有严格反爬,但也不会让自动脚本太舒服,alert 行为不是很可控,会随机弹。
    2.在没有严格流程控制的情况下不让弹窗阻塞脚本( selenium 的方案是在上级 catch 异常即可,所以我可以很粗糙地开发但仍然保持对流程的高度控制)。
    3. 服务器对验证码的判断结果由 alert 返回。这个场景的问题是,验证码 cv 识别有成功率,handle 不能撤回只能依赖 timeout 和等待让代码健壮性变成依托。

    以上这些场景都是 trycatch 非常合适的应用场景,你不知道流程会在脚本执行到哪步时触发异常行为,但是因为有异常直接 catch 所以整体流程依然可控。现在没有办法 catch 的原因是弹窗后整个被阻塞,即使尝试用 next_one 预埋 handler ,因为你是单线程同步脚本,又没有个回调,这该怎么控制。
    g1879
        34
    g1879  
    OP
       Feb 20, 2024
    @LeeReamond 你用的是哪个版本?新版出现 alert 是没有阻塞的,alert 存在也会向后执行,但如果这个时候调用设计 js 的操作,才会抛出 AlertExistsError 。你的代码给我看看?
    ZnductR0MjHvjRQ3
        35
    ZnductR0MjHvjRQ3  
       Feb 20, 2024
    大佬 是否支持 带账号密码的代理 IP ? 以及无痕模式/隔离?
    forsky
        36
    forsky  
       Feb 20, 2024
    编程新人, 这是我 pip 安装的第一个包。 很好用,还在学习中
    ZnductR0MjHvjRQ3
        37
    ZnductR0MjHvjRQ3  
       Feb 21, 2024
    仔细看了一下文档 确实牛逼
    说真的大佬 就光说文档这块 都比 翻起来巨恶心的 selenium 强了很多了
    并且我仔细看了一下 4.0 功能确实也很全了,做大部分自动化的东西也已经够用了
    目前手里的一个项目就需要用到自动化浏览器的功能,后面我尝试用一下看
    LeeReamond
        38
    LeeReamond  
       Feb 21, 2024
    @g1879 最近一周内安装的版本。你指的没有阻塞是设置了 autoaccept 或者 nextone 的情况下没有阻塞吧,普通的出现弹窗事件->处理弹窗事件的逻辑是阻塞的。

    https://gist.github.com/RedmondLee/ec0c13215c97c9902cd8c12ecbfbca1c
    g1879
        39
    g1879  
    OP
       Feb 23, 2024
    @LeeReamond 如果接管前 alert 就存在,是没有办法接管的。
    LeeReamond
        40
    LeeReamond  
       Feb 24, 2024
    @g1879 上面说了半天了,你指的没有阻塞是设置了 autoaccept 或者 nextone 的情况,而无法实现对弹窗的发现后处理。
    g1879
        41
    g1879  
    OP
       Feb 24, 2024 via Android
    @LeeReamond 不是,无论是否设置都不阻塞。但是无论是否设置也都不能在 alert 出现后接管浏览器。
    如果 alert 在程序接管前出现,才会阻塞。
    LeeReamond
        42
    LeeReamond  
       Feb 25, 2024
    @g1879 你应该加入一个选项,比如起码在 autoaccept 的同时 raiseException ,让用户代码可以管理中断
    g1879
        43
    g1879  
    OP
       Feb 25, 2024 via Android
    @Motorola3 带账号代理目前需要用插件,无痕模式有这个设置。
    chinesehuazhou
        44
    chinesehuazhou  
       Mar 2, 2024
    不错,收录到我的 Python 潮流周刊
    mykaii
        45
    mykaii  
       Mar 11, 2024
    之前用过几次,支持,就是文档不太友好
    jettzhang
        46
    jettzhang  
       Apr 3, 2024
    试用一下先,感谢大佬
    jettzhang
        47
    jettzhang  
       Apr 7, 2024
    正在使用,真香,希望可以加入设置浏览器指纹和代理 IP
    lengdandan
        48
    lengdandan  
       May 17, 2024
    @g1879 很惊艳,本来使用的 Playwright ,目标网站识别机器人。换成 drissionpage 完美过了。
    werwer
        49
    werwer  
       Aug 26, 2024
    大佬好久没在这里冒泡了,应该是有事情要忙吧,祝一切顺利
    curionox
        50
    curionox  
       Mar 12, 2025
    大佬,项目很棒,已经 start ,现在使用的时候遇到个问题,我用 drissionpage 启动浏览器,有自定义文件夹存放用户数据,并且加载了插件,每次启动,都需要执行加载动作吗?按我理解,第一次加载了,用户数据,和插件数据已经有了吧,然后插件每次都跳出插件的登陆页,和新安装完插件一样。
    lizy0329
        51
    lizy0329  
       Mar 12, 2025
    非常强悍,搭配 python 生态,无敌
    About     Help     Advertise     Blog     API     FAQ     Solana     4692 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 139ms UTC 04:05 PVG 12:05 LAX 21:05 JFK 00:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86