网络爬虫之DrissionPage工具

DrissionPage是一个基于Python的工具,结合了浏览器自动化和数据包发送功能,提供简洁语法、快速操作、跨iframe元素查找和多标签页管理。它支持无webdriver,减少了识别问题,适合新手使用,能进行网页操作、数据抓取、截图和文件下载等任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DrissionPage 是一个基于 python 的网页自动化工具。

它既能控制浏览器,也能收发数据包,还能把两者合而为一。

可兼顾浏览器自动化的便利性和 requests 的高效率。

它功能强大,内置无数人性化设计和便捷功能。

它的语法简洁而优雅,代码量少,对新手友好。

DrissionPage的优点:

无 webdriver 特征,不会被网站识别 无需为不同版本的浏览器下载不同的驱动 运行速度更快 可以跨 iframe 查找元素,无需切入切出 把 iframe 看作普通元素,获取后可直接在其中查找元素,逻辑更清晰 可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,无需切换 可以直接读取浏览器缓存来保存图片,无需用 GUI 点击另存 可以对整个网页截图,包括视口外的部分(90以上版本浏览器支持) 可处理非open状态的 shadow-root

语法:

WebPage是功能最全面的页面类,既可控制浏览器,也可收发数据包:

from DrissionPage import WebPage

如果只要控制浏览器,导入ChromiumPage

from DrissionPage import ChromiumPage

如果只要收发数据包,导入SessionPage

from DrissionPage import SessionPage
  • 配置

    ChromiumOptions类用于设置浏览器启动参数:

    from DrissionPage import ChromiumOptions

    SessionOptions类用于设置Session对象启动参数:

    from DrissionPage import SessionOptions

    动作链,用于模拟一系列键盘和鼠标的操作:

    from DrissionPage import ActionChains

    键盘按键类,用于键入 ctrl、alt 等按键:

    from DrissionPage import Keys

    easy_set里保存了一些便捷的 ini 文件设置方法,可选择使用:

    from DrissionPage.easy_set import *
  • 定位元素

    from DrissionPage import ChromiumPage
     
    # 创建页面对象,并启动或接管浏览器
    page = ChromiumPage()
    # 跳转到登录页面
    page.get('https://gitee.com/login')    # get()方法用于访问参数中的网址。它会等待页面完全加载,再继续执行后面的代码。
     
    # 定位到账号文本框,获取文本框元素
    ele = page.ele('#user_login')    # ele()方法用于查找元素,它返回一个ChromiumElement对象,用于操作元素。'#user_login'是定位符文本,#意思是按id属性查找元素。ele()内置了等待,如果元素未加载,它会执行等待,直到元素出现或到达时限。默认超时时间 10 秒。
     
    # 输入对文本框输入账号
    ele.input('您的账号')
    # 定位到密码文本框并输入密码
    page.ele('#user_password').input('您的密码')
    # 点击登录按钮
    page.ele('@value=登 录').click()    # @表示按属性名查找
  • 爬取网页

    from DrissionPage import SessionPage
     
    # 创建页面对象
    page = SessionPage()
     
    # 爬取3页
    for i in range(1, 4):
        # 访问某一页的网页
        page.get(f'https://gitee.com/explore/all?page={i}')
        # 获取所有开源库<a>元素列表
        links = page.eles('.title project-namespace-path')    # 页面对象的eles()获取页面中所有class属性为'title project-namespace-path'的元素对象,eles()方法用于查找多个符合条件的元素,返回由它们组成的list
        # 遍历所有<a>元素
        for link in links:
            # 打印链接信息
            print(link.text, link.link)    # .text获取元素的文本,.link获取元素的href或src属性

  • 下载网页

    from DrissionPage import SessionPage 
     
    url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'
    save_path = r'C:\download'    # 保存的路径
     
    page = SessionPage()
    page.download(url, save_path, 'img')  # 支持重命名,处理文件名冲突

  • 元素查找

    # 根据属性查找,@ 后面可跟任意属性
    page.ele('@id:ele_id', timeout=2)  # 查找 id 为 ele_id 的元素,设置等待时间2秒  
    page.eles('@class')  # 查找所有拥有 class 属性的元素
    page.eles('@class:class_name')  # 查找所有 class 含有 ele_class 的元素 
    page.eles('@class=class_name')  # 查找所有 class 等于 ele_class 的元素 
     
    # 根据 class 或 id 查找
    page.ele('#ele_id')  # 等价于 page.ele('@id=ele_id')
    page.ele('#:ele_id')  # 等价于 page.ele('@id:ele_id')
    page.ele('.ele_class')  # 等价于 page.ele('@class=ele_class')
    page.ele('.:ele_class')  # 等价于 page.ele('@class:ele_class')
     
    # 根据 tag name 查找
    page.ele('tag:li')  # 查找第一个 li 元素  
    page.eles('tag:li')  # 查找所有 li 元素  
     
    # 根据 tag name 及属性查找
    page.ele('tag:div@class=div_class')  # 查找 class 为 div_class 的 div 元素
    page.ele('tag:div@class:ele_class') # 查找 class 含有 ele_class 的 div 元素
    page.ele('tag:div@class=ele_class') # 查找 class 等于 ele_class 的 div 元素
    page.ele('tag:div@text():search_text') # 查找文本含有 search_text 的 div 元素
    page.ele('tag:div@text()=search_text') # 查找文本等于 search_text 的 div 元素
     
    # 根据文本内容查找
    page.ele('search text')  # 查找包含传入文本的元素  
    page.eles('text:search text')  # 如文本以 @、tag:、css:、xpath:、text: 开头,则应在前加上 text: 避免冲突  
    page.eles('text=search text')  # 文本等于 search_text 的元素
     
    # 根据 xpath 或 css selector 查找
    page.eles('xpath://div[@class="ele_class"]')  
    page.eles('css:div.ele_class')  
     
    # 根据 loc 查找
    loc1 = By.ID, 'ele_id'
    loc2 = By.XPATH, '//div[@class="ele_class"]'
    page.ele(loc1)
    page.ele(loc2)
     
    # 查找下级元素
    element = page.ele('@id:ele_id')
    element.ele('@class:class_name')  # 在 element 下级查找第一个 class 为 ele_class 的元素
    element.eles('tag:li')  # 在 ele_id 下级查找所有li元素
     
    # 根据位置查找
    element.parent  # 父元素  
    element.next  # 下一个兄弟元素  
    element.prev  # 上一个兄弟元素  
     
    # 获取 shadow-root,把它作为元素对待。只支持 open 的 shadow-root
    ele1 = element.shadow_root.ele('tag:div')
     
    # 串连查找
    page.ele('@id:ele_id').ele('tag:div').next.ele('some text').eles('tag:a')
     
    # 简化写法
    eles = page('@id:ele_id')('tag:div').next('some text').eles('tag:a')
    ele2 = ele1('tag:li').next('some text')
    

  • 元素操作

    element.click(by_js)  # 点击元素,可选择是否用 js 方式点击
    element.input(value)  # 输入文本
    element.run_script(js)  # 对元素运行 JavaScript 脚本
    element.submit()  # 提交
    element.clear()  # 清空元素
    element.screenshot(path, filename)  # 对元素截图
    element.select(text)  # 根据文本选择下拉列表
    element.set_attr(attr, value)  # 设置元素属性值
    element.remove_attr(attr)  # 删除属性
    element.drag(x, y, speed, shake)  # 拖动元素相对距离,可设置速度和是否随机抖动
    element.drag_to(ele_or_loc, speed, shake)  # 拖动元素到另一个元素或某个坐标,可设置速度和是否随机抖动
    element.hover()  # 在元素上悬停鼠标+
  • 元素属性

    element.html  # 返回元素 outerHTML
    element.inner_html  # 返回元素 innerHTML
    element.tag  # 返回元素 tag name
    element.text  # 返回元素 innerText 值
    element.comments  # 返回元素内注释列表
    element.link  # 返回元素 href 或 src 绝对 url
    element.texts()  # 返回元素内所有直接子节点的文本,包括元素和文本节点,可指定只返回文本节点
    element.attrs  # 返回元素所有属性的字典
    element.attr(attr)  # 返回元素指定属性的值
    element.css_path  # 返回元素绝对 css 路径
    element.xpath  # 返回元素绝对 xpath 路径
    element.parent  # 返回元素父元素
    element.next  # 返回元素后一个兄弟元素
    element.prev  # 返回元素前一个兄弟元素
    element.parents(num)  # 返回第 num 级父元素
    element.nexts(num, mode)  # 返回后面第几个元素或节点
    element.prevs(num, mode)  # 返回前面第几个元素或节点
    element.ele(loc_or_str, timeout)  # 返回当前元素下级第一个符合条件的子元素、属性或节点文本
    element.eles(loc_or_str, timeout)  # 返回当前元素下级所有符合条件的子元素、属性或节点文本

  • 浏览器和数据包模式切换

    from DrissionPage import WebPage
    ​
    # 创建页面对象
    page = WebPage()
    # 访问网址
    page.get('https://www.baidu.com')
    # 查找文本框元素并输入关键词
    page('#kw').input('DrissionPage')
    # 点击搜索按钮
    page('#su').click(wait_loading=True)
    # 切换到收发数据包模式
    page.change_mode()
    # 获取所有<h3>元素
    links = page.eles('tag:h3')
    # 遍历获取到的元素
    for link in links:
        # 打印元素文本
        print(link.text)
    ​
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨非墨Lg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值