1. 为什么选择 DrissionPage 做网页 RPA第一次接触网页自动化时我也像大多数人一样直奔 Selenium。直到有次处理需要频繁切换代理的项目浏览器实例反复崩溃让我苦不堪言。偶然发现 DrissionPage 这个国产库后我的爬虫效率直接翻倍——它用混合模式同时支持 Chromium 和 requests遇到反爬严重的网站时可以无缝切换 HTTP 请求和浏览器渲染两种模式。相比传统方案DrissionPage 有三个杀手级优势零配置启动不用单独下载浏览器驱动安装完库就能直接控制 Chromium内存占用低实测相同任务比 Selenium 少占用 30% 内存智能等待机制内置元素等待、网络空闲检测不用再写 sleep 硬等待去年帮某媒体做舆情监控系统时我们用 DrissionPage 同时控制 50 个浏览器实例采集数据稳定运行了三个月没出现过内存泄漏。这种工业级可靠性在开源库中确实难得。2. 搭建自动化采集环境2.1 安装避坑指南虽然官方文档说 pip install 就能用但新手常卡在环境依赖上。建议按这个顺序操作# 先升级 pip 避免安装超时 python -m pip install --upgrade pip # 使用清华源加速下载 pip install DrissionPage -i https://pypi.tuna.tsinghua.edu.cn/simple如果遇到 SSL 证书错误常见于 Windows可以临时加上信任参数pip install DrissionPage --trusted-host pypi.tuna.tsinghua.edu.cn验证安装时别用官方示例试试这个更全面的检测脚本from DrissionPage import ChromiumPage page ChromiumPage() page.get(http://httpbin.org/headers) print(page.html)能看到浏览器真实请求头就说明环境没问题。第一次运行会自动下载 Chromium国内用户建议挂个代理注此处需注意合规表述或耐心等待。2.2 浏览器配置优化默认配置适合调试但批量采集需要调整参数from DrissionPage import ChromiumOptions co ChromiumOptions() co.headless() # 无头模式 co.no_imgs(True) # 禁止加载图片 co.mute(True) # 静音 page ChromiumPage(addr_driver_optsco)这几个设置能让内存占用降低 40%特别提醒不要同时开超过 CPU 核心数两倍的浏览器实例每个实例用完记得调用 page.quit() 释放资源启用 no_imgs 后记得调整 XPath有些网站用图片占位符会影响定位3. 新闻列表批量采集实战3.1 智能翻页抓取技巧以抓取某新闻网站时政板块为例传统方法是找下一页按钮的 XPath。但更稳健的做法是while True: # 获取当前页所有新闻链接 links page.eles(xpath://h3[classtitle]/a) for link in links: news_url link.attr(href) process_news(news_url) # 处理单条新闻 # 判断是否到达末页 if page.ele(xpath://a[contains(text(),下一页)], timeout2): page.ele(xpath://a[contains(text(),下一页)]).click() page.wait.load_start() # 等待新页面开始加载 else: break这里有两个关键点用 contains 模糊匹配下一页按钮避免因 class 变化失效wait.load_start() 比 sleep 更精准能自适应不同网络环境3.2 多线程加速方案单线程爬取太慢试试这个生产者-消费者模型from concurrent.futures import ThreadPoolExecutor def worker(url): tab page.new_tab() tab.get(url) data extract_data(tab) tab.close() return data with ThreadPoolExecutor(max_workers4) as executor: futures [executor.submit(worker, url) for url in news_urls] results [f.result() for f in futures]注意要控制并发数建议每个线程独立使用 tab 对象不要跨线程共享 page 主体数据库写入加锁避免冲突4. 数据清洗与结构化存储4.1 高效数据清洗方案新闻正文常混入广告、推荐等噪音内容。这套组合拳效果不错import re from bs4 import BeautifulSoup def clean_content(html): # 移除 script/style 标签 soup BeautifulSoup(html, lxml) for tag in soup([script, style, iframe]): tag.decompose() # 标准化空白字符 text soup.get_text() text re.sub(r\s, , text) # 提取核心段落根据网站特点调整 paras [p for p in text.split(\n) if len(p.strip()) 30] return \n.join(paras[:5]) # 取前五个有效段落4.2 数据库存储优化CSV 适合小数据量当单日采集超过 1 万条时建议用 SQLiteimport sqlite3 from contextlib import closing def init_db(): with closing(sqlite3.connect(news.db)) as conn: conn.execute(CREATE TABLE IF NOT EXISTS news (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, pub_date DATETIME, content TEXT, source TEXT)) def save_to_db(data): with closing(sqlite3.connect(news.db)) as conn: conn.executemany(INSERT INTO news (title, pub_date, content, source) VALUES (?, ?, ?, ?), data) conn.commit()实战建议使用 executemany 批量插入提升性能对 title 字段建立索引加速查询定期执行 VACUUM 压缩数据库5. 反反爬策略与容错设计5.1 智能请求头管理很多网站会检查 User-AgentDrissionPage 可以动态轮换from fake_useragent import UserAgent ua UserAgent() page.set.useragent(ua.random) # 每次请求随机 UA # 更彻底的伪装 page.set.cookies({session_id: random_string}) page.set.referer(https://www.google.com)5.2 断点续采方案大规模采集必须考虑异常处理import pickle from datetime import datetime def save_progress(urls, done_set): with open(progress.pkl, wb) as f: pickle.dump({ timestamp: datetime.now(), remaining: list(set(urls) - done_set) }, f) def load_progress(): try: with open(progress.pkl, rb) as f: return pickle.load(f)[remaining] except FileNotFoundError: return []这套方案能保证程序崩溃后从断点继续自动跳过已采集的 URL记录最后运行时间方便排错6. 性能监控与调优6.1 资源监控方案长时间运行需要关注内存占用import psutil import time def monitor(): while True: mem psutil.virtual_memory() print(f内存使用率: {mem.percent}%) if mem.percent 80: alert_admin() time.sleep(60)6.2 浏览器实例回收策略推荐使用对象池模式管理浏览器实例from queue import Queue class BrowserPool: def __init__(self, size3): self.pool Queue(maxsizesize) for _ in range(size): self.pool.put(ChromiumPage()) def get_browser(self): return self.pool.get() def release(self, page): page.get(about:blank) # 重置到空白页 self.pool.put(page)这样能避免频繁创建销毁带来的性能损耗实测 QPS 能提升 2-3 倍。