有些网站(如 linux.do)的图片资源受 Cloudflare 保护,直接用 requests 请求会被拦截。本文介绍如何用 DrissionPage 控制真实浏览器通过验证,提取 cookie 后用 urllib 批量下载图片。
思路
- 用 DrissionPage 启动 Chromium 浏览器访问目标页面
- 等待 Cloudflare “Just a moment” 验证页面自动通过
- 通过 CDP 协议提取浏览器中的 cookie
- 用提取到的 cookie 构造请求头,用 urllib 下载图片
关键代码
1. 配置浏览器选项
1 | from DrissionPage import Chromium, ChromiumOptions |
auto_port() 让每次启动使用不同端口,可以多实例并行。
2. 等待 Cloudflare 验证通过
1 | import time |
原理很简单:Cloudflare 验证页的 <title> 通常是 “Just a moment…” 或 “Checking your browser…”,只要轮询到标题变成正常内容,就说明验证通过了。
3. 通过 CDP 提取 Cookie
这是最核心的部分——用 Chrome DevTools Protocol 的 Network.getAllCookies 拿到浏览器里的所有 cookie:
1 | def domain_matches(host: str, domain: str) -> bool: |
两种方式互补取 cookie:CDP 的 Network.getAllCookies 能拿到 HttpOnly 标记的 cookie(Cloudflare 的 cf_clearance 就是 HttpOnly 的),DrissionPage 自带的 API 作为兜底。
4. 收集会话信息(完整流程)
把上面的步骤串起来,打开浏览器 → 等验证 → 轮询提取 cookie → 验证 cookie 有效性:
1 | COOKIE_WAIT_SECONDS = 180 |
关键点:
- 设 180 秒超时,留足人工点击验证码的时间
- 每 3 秒轮询一次 cookie,拿到后立即用
probe_session试下载一张图片验证 cookie 是否有效 - 用
tab.run_js("return navigator.userAgent")获取浏览器真实 UA,保证后续请求的 UA 和获取 cookie 时一致
5. 带 Cookie 下载图片
1 | import ssl |
注意设置 Referer 头,有些 CDN 会校验来源。下载后检查 Content-Type,如果返回的是 HTML 而不是图片,说明 cookie 已失效或被拦截了。
安装依赖
1 | pip install DrissionPage |
DrissionPage 会自动查找系统中已安装的 Chromium 内核浏览器(Chrome、Edge 等),无需额外安装 chromedriver。
总结
整个方案的核心就一句话:用真实浏览器过 Cloudflare 验证,通过 CDP 协议偷 cookie,再把 cookie 塞到 urllib 请求里下载资源。相比 undetected-chromedriver 等方案,DrissionPage 的优势是 API 简洁,且内置了 CDP 操作支持。
说些什么吧!