drissionpage知识整理与某数等反爬产品绕过实战

概述

DrissionPage是一个基于 Python 的网页自动化工具。既能控制浏览器,也能收发数据包,还能把两者合而为一。可兼顾浏览器自动化的便利性和 requests 的高效率。功能强大,语法简洁优雅,代码量少,对新手友好。

入门文档

drissionpage作者提供了详细的入门教程,这里就列出用法了,需要时直接到官方文档查询即可。

官方文档还提供了几个大佬录制的视频教程,方便食用
在这里插入图片描述

主页面对象

主页面对象有 3 种,它们通常是程序的入口:

  • ChromiumPage:单纯用于操作浏览器的页面对象
  • WebPage:整合浏览器控制和收发数据包于一体的页面对象
  • SessionPage:单纯用于收发数据包的页面对象

我的理解是:
WebPage其实整合了ChromiumPage和SessionPage两个页面对象
在这里插入图片描述

而ChromiumPage跟selenium、playwright应用上差不多,可操控浏览器
SessionPage是一个使用使用Session(requests 库)对象的页面,是一个使用使用Session(requests 库)对象的页面,它使用 POM 模式封装了网络连接和 html 解析功能,收发数据包效果跟requests相同,不过它提供了丰富的功能。

采集案例

某书搜索列表页

刚遇到问题,就是某书的搜索列表页是没有滚动条的,一般情况下只能鼠标滚轮滚动
大家估计都会使用下面这种方式来实现翻页

wp = WebPage()
wp.get('url')
wp.listen.start('web/v1/search/notes')
ac = Actions(wp)
packet = wp.listen.wait()
ac.scroll(delta_y=1500)

但是这种方式循环滚动两次后,会发现一直卡在第三次循环,这是啥原因呢

这是因为此时的scroll是对driver对象进行操作的,那它只会滚动到浏览器界面的最大值,不会再重置后继续滚动了,也就导致了程序一直处于wp.listen.wait()这一步。

这时其实可以使用执行JavaScript代码的方式实现屏幕滚动,下面代码既可以解决问题

wp.run_js('''
// 滚动函数
function scrollDown() {
   
  window.scrollBy(0, 2000); // 向下滚动2000像素
}
 
// 设置定时器,每隔1秒调用一次滚动函数
setInterval(scrollDown, 1000);
''')

说到底scroll方法操作的对象是元素。

某瓣小说封面

简单采集某瓣小说封面,更多案例可以看官方文档提供的。

import os.path

from DrissionPage import ChromiumPage, ChromiumOptions
from DrissionPage import SessionPage


def download():
    dp = ChromiumOptions().set_paths(browser_path=r'C:\Program Files\Google\Chrome\Application\chrome.exe')
    page = ChromiumPage(dp)

    page.get('https://book.douban.com/tag/小说?start=0&type=T', retry=3, interval=2, timeout=15)

    for _ in range(2):
        for book in page.eles('x://li[@class="subject-item"]'):
            book_name = book.ele('x://h2/a').attr('title')
            img = book('x://img')
            img.save(path='./img/', name=f"{
     book_name}.png")
            print(f"{
     book_name}.png 保存成功!")

        # 点击下一页
        page('后页>').click()
        page.wait.load_start()

    page.close()


def headless_download():
    """ 无头模拟实现 """
    page = SessionPage()

    if not os.path.exists('./img'):
        os.mkdir(
<think>嗯,用户让我介绍Python的第三方库DrissionPage的教程。首先,我需要回忆一下DrissionPage是什么,它有什么特点和用途。我记得DrissionPage是一个用于网页自动化爬虫的库,结合了Selenium和requests的优点,可能同时支持动态和静态页面操作。然后,我应该确认它的主要功能,比如页面操作、元素定位、数据提取等。 用户可能是一个刚开始学习Python爬虫的开发者,或者是有一定经验但想寻找更高效工具的人。他们可能对Selenium的复杂性或速度不满意,想找一个替代方案。需要强调DrissionPage的优势,比如简化API、提升效率、同时处理两种页面类型。 接下来,我需要组织内容结构。先介绍基本概念,然后安装方法,再通过示例展示常见用法,比如打开网页、定位元素、处理表单、等待机制、数据抓取等。可能还需要提到Selenium和requests的对比,帮助用户理解为何选择DrissionPage。 要注意避免使用过于专业的术语,保持解释的易懂性。同时,提供代码示例时,要确保正确性,并加上注释说明每一步的作用。最后,可以推荐学习资源,如官方文档和社区,帮助用户进一步学习。 需要检查是否有错误的信息,比如DrissionPage的最新版本是否有变化,安装命令是否正确。另外,考虑用户可能遇到的常见问题,比如环境配置或元素定位的困难,可以提前给出提示或解决方案。 总结来说,回答需要结构清晰,涵盖安装、基本使用、示例和资源,突出库的优势,满足不同层次用户的需求,同时确保信息准确无误。</think>DrissionPage 是一个基于 Python 的第三方库,专注于网页自动化操作和数据采集,巧妙结合了 **Selenium**(动态网页操作)和 **requests**(静态网页请求)的优势,提供更简洁高效的 API。其设计目标是简化爬虫自动化脚本开发,尤其适合需要同时处理动态渲染和静态页面的场景。 --- ### **核心优势** 1. **二合一模式**:无需切换工具,同时支持动态浏览器操作(如点击、表单提交)和高效静态请求。 2. **简化语法**:相比 Selenium 更简洁的定位语法,类似 BeautifulSoup 的解析方式。 3. **自动等待**:内置智能等待机制,减少因元素未加载导致的错误。 4. **高性能**:静态请求模式直接复用 requests,速度远超浏览器驱动。 --- ### **安装方法** ```bash pip install DrissionPage ``` --- ### **基础使用教程** #### **1. 初始化页面访问** ```python from DrissionPage import ChromiumPage # 创建页面对象(默认使用浏览器模式) page = ChromiumPage() # 访问网页 page.get("https://www.example.com") ``` #### **2. 元素定位** 支持多种定位方式(XPath、CSS Selector、文本等): ```python # 通过 CSS 选择器定位 element = page.ele('#search-input') # 通过文本定位链接 link = page.ele('text=新闻') ``` #### **3. 元素操作** ```python # 输入文本并提交表单 element.input("Python教程") element.click() # 假设是搜索按钮 # 获取元素属性 print(element.attr('href')) # 提取文本 title = page.ele('tag:h1').text ``` #### **4. 切换静态请求模式** ```python from DrissionPage import SessionPage # 使用 requests 风格的会话 session_page = SessionPage() session_page.get("https://api.example.com/data") # 直接解析响应内容 data = session_page.json() ``` #### **5. 等待页面交互** ```python # 显式等待元素出现 element = page.wait.ele_visible('#result-list', timeout=10) # 滚动到元素所在位置 element.scroll.to_see() ``` #### **6. 数据采集示例** 采集分页表格数据: ```python for page_num in range(1, 6): page.get(f'https://example.com/list?page={page_num}') items = page.eles('tag:tr') for item in items: print(item.ele('tag:td').text) ``` --- ### **进阶功能** - **下载文件**:直接通过会话下载,避免浏览器限制。 - **模拟浏览器指纹**:规避机制。 - **多标签页管理**:类似浏览器的多标签操作。 - ** Pandas 集成**:快速将表格数据转为 DataFrame。 --- ### **学习资源推荐** 1. **官方文档**: [https://g1879.gitee.io/drissionpagedocs/](https://g1879.gitee.io/drissionpagedocs/) 2. **GitHub 示例**: [https://github.com/g1879/DrissionPage](https://github.com/g1879/DrissionPage) 3. **实战案例**: 官方文档提供电商、论坛等场景的爬虫示例。 --- ### ** Selenium/requests 对比** | 特性 | DrissionPage | Selenium | requests | |---------------------|--------------|----------------|----------------| | 动态页面支持 | ✅ | ✅ | ❌ | | 静态请求速度 | ✅ | ❌ | ✅ | | API 简洁度 | ★★★★ | ★★ | ★★★ | | 绕过能力 | ★★★ | ★★ | ★ | 适合场景:需要兼顾动态交互高效采集的项目,或希望减少代码复杂度的开发者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

九月镇灵将

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

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

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

打赏作者

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

抵扣说明:

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

余额充值