Python
DrissionPage 使用教程:Python 动态网页自动化
介绍 DrissionPage 这款 Python 网页自动化工具,融合浏览器与 HTTP 请求模式。涵盖环境搭建、基础操作、元素定位、智能等待、混合模式实战及反爬策略。通过知乎热榜采集案例展示完整流程,并提供性能优化与常见问题排查指南,帮助开发者高效处理动态网页数据抓取任务。

介绍 DrissionPage 这款 Python 网页自动化工具,融合浏览器与 HTTP 请求模式。涵盖环境搭建、基础操作、元素定位、智能等待、混合模式实战及反爬策略。通过知乎热榜采集案例展示完整流程,并提供性能优化与常见问题排查指南,帮助开发者高效处理动态网页数据抓取任务。

DrissionPage 是一款基于 Python 的全能型网页自动化工具,创新性地将浏览器自动化与直接 HTTP 请求两大模式完美融合。它不仅具备 Selenium 的动态页面处理能力,还拥有 requests 的高效特性,堪称爬虫开发者的瑞士军刀。
| 特性 | 传统方案 | DrissionPage |
|---|---|---|
| 浏览器驱动依赖 | 需要 ChromeDriver | 无需额外驱动 |
| 动态页面处理 | 仅浏览器模式 | 双模式协同作战 |
| 执行效率 | 较慢 | 智能提速 50%+ |
| 反爬对抗能力 | 较弱 | 内置指纹伪装 |
| 代码复杂度 | 高 | 极简 API 设计 |
# 安装最新稳定版
pip install DrissionPage
# 升级到最新开发版
pip install DrissionPage --upgrade
from DrissionPage import ChromiumOptions
# 自动下载并配置 Chromium
co = ChromiumOptions().auto_install()
# 高级配置示例(无头模式 + 中文语言)
co.set_headless(True)
co.set_lang('zh-CN')
from DrissionPage import ChromiumPage
# 初始化浏览器(可视化模式)
page = ChromiumPage(addr_driver_opts=co)
# 访问目标网站
page.get('https://www.zhihu.com')
# 定位搜索框并输入关键词
search_box = page.ele('#Popover1-toggle')
search_box.input('人工智能')
# 点击搜索按钮
search_btn = page.ele('xpath://button[@type="submit"]')
search_btn.click()
| 定位方式 | 示例代码 | 适用场景 |
|---|---|---|
| CSS 选择器 | page.ele('#main > .title') | 精确层级定位 |
| XPath | page.ele('//div[@class="card"]') | 复杂结构定位 |
| 文本定位 | page.ele('text:热门话题') | 模糊匹配内容 |
| 正则表达式 | page.ele('text:^\d+月榜单$') | 模式匹配内容 |
| 链式定位 | page.ele('#header').ele('.logo') | 分步缩小范围 |
# 显式等待元素出现(最多 10 秒)
answer_div = page.wait.ele_loaded('.AnswerItem', timeout=10)
# 等待页面跳转完成
page.wait.load_start()
# 等待 Ajax 加载完成
page.wait.ajax_load('//div[@class="comment-list"]')
from DrissionPage import SessionPage
session = SessionPage()
# 发送 GET 请求
session.get('https://api.zhihu.com/topstory')
# 自动解析 JSON
print(session.json['data'][0]['title'])
# 自定义请求头
session.headers = {
'Referer': 'https://www.zhihu.com',
'X-Requested-With': 'XMLHttpRequest'
}
# 设置代理
session.proxies = {'http': 'http://127.0.0.1:1080'}
# 文件下载
session.download('https://example.com/report.pdf', './data')
# 浏览器模式获取动态 token
page.get('https://m.weibo.cn')
token = page.ele('meta[name="csrf"]').attr('content')
# 切换到 HTTP 模式批量抓取
session = SessionPage()
for page_num in range(1, 6):
url = f'https://m.weibo.cn/api/feed?token={token}&page={page_num}'
session.get(url)
print(session.json['data'])
# 浏览器模式登录
page.get('https://passport.zhihu.com/login')
page.ele('#username').input('[email protected]')
page.ele('#password').input('your_password')
page.ele('button[type="submit"]').click()
# 同步 Cookie 到 HTTP 模式
session.cookies = page.cookies
# 使用共享登录态
session.get('https://www.zhihu.com/notifications')
co = ChromiumOptions()
# 修改浏览器指纹
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
co.set_platform('Win32')
co.set_resolution(1920, 1080)
# 禁用 WebRTC
co.set_argument('--disable-webrtc')
# 随机化操作间隔
import random
page.set.click_options(interval=(0.5, 2))
# 模拟人类滚动
page.scroll.to_bottom(step=300, duration=1.5)
from DrissionPage import ChromiumPage
from time import sleep
import pandas as pd
def get_zhihu_hot():
page = ChromiumPage()
page.get('https://www.zhihu.com/hot')
results = []
for _ in range(5):
items = page.eles('.HotItem')
for item in items:
title = item.ele('.HotItem-title').text
heat = item.ele('.HotItem-metrics').text
answers = item.ele('text:回答').parent().text.split()[0]
time = item.ele('.HotItem-time').text
results.append({
'标题': title,
'热度': heat,
'回答数': answers,
'发布时间': time
})
if page.wait.ele_loaded('.Pagination-next', timeout=3):
page.ele('.Pagination-next').click()
page.wait.load_start()
else:
break
df = pd.DataFrame(results)
df.to_excel('知乎热榜.xlsx', index=False)
if __name__ == '__main__':
get_zhihu_hot()
# 禁用非必要资源加载
page.set.load_mode.images(False) # 关闭图片
page.set.load_mode.scripts(False) # 关闭 JavaScript
# 内存优化
page.set.memory_limit('80%') # 限制内存使用
# 启用连接池
session.set.pool_size(10)
# 自动重试配置
session.set.retry_times(3) # 重试次数
session.set.retry_interval(5) # 重试间隔(秒)

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online