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
g1879
V2EX  ›  Python

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

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

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

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

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

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

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

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

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

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

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

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

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

    https://gist.github.com/RedmondLee/ec0c13215c97c9902cd8c12ecbfbca1c
    g1879
        39
    g1879  
    OP
       64 天前
    @LeeReamond 如果接管前 alert 就存在,是没有办法接管的。
    LeeReamond
        40
    LeeReamond  
       63 天前
    @g1879 上面说了半天了,你指的没有阻塞是设置了 autoaccept 或者 nextone 的情况,而无法实现对弹窗的发现后处理。
    g1879
        41
    g1879  
    OP
       63 天前 via Android
    @LeeReamond 不是,无论是否设置都不阻塞。但是无论是否设置也都不能在 alert 出现后接管浏览器。
    如果 alert 在程序接管前出现,才会阻塞。
    LeeReamond
        42
    LeeReamond  
       63 天前
    @g1879 你应该加入一个选项,比如起码在 autoaccept 的同时 raiseException ,让用户代码可以管理中断
    g1879
        43
    g1879  
    OP
       62 天前 via Android
    @Motorola3 带账号代理目前需要用插件,无痕模式有这个设置。
    chinesehuazhou
        44
    chinesehuazhou  
       56 天前
    不错,收录到我的 Python 潮流周刊
    mykaii
        45
    mykaii  
       47 天前
    之前用过几次,支持,就是文档不太友好
    jettzhang
        46
    jettzhang  
       24 天前
    试用一下先,感谢大佬
    jettzhang
        47
    jettzhang  
       21 天前
    正在使用,真香,希望可以加入设置浏览器指纹和代理 IP
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   872 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:17 · PVG 05:17 · LAX 14:17 · JFK 17:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.