feat: 支持连接用户已有的 Chrome 浏览器进行爬取

新增 CDP_CONNECT_EXISTING 配置项,默认开启,通过 Chrome 远程调试功能
(chrome://inspect/#remote-debugging) 直接连接用户正在使用的浏览器,
复用真实的 Cookie、扩展和浏览历史,大幅降低平台风控检测风险。

主要变更:
- 新增 _connect_existing_browser 方法,通过 ws:// 直接连接已有浏览器
- 支持等待用户在浏览器端确认连接对话框(60秒超时)
- cleanup 时不关闭用户的浏览器进程
- 修复小红书在真实浏览器下 cookie 过多导致签名失败的问题
- 更新 README、CDP使用指南和常见问题文档
This commit is contained in:
程序员阿江(Relakkes)
2026-04-15 10:54:29 +08:00
parent e5ec29d4ff
commit 5294b6d9b7
7 changed files with 255 additions and 51 deletions

View File

@@ -12,34 +12,63 @@ CDPChrome DevTools Protocol模式是一种高级的反检测爬虫技术
4. **扩展支持**: 可以利用用户安装的广告拦截器、代理扩展等工具
5. **更自然的行为**: 浏览器行为模式更接近真实用户
### 📌 两种 CDP 模式
CDP模式支持两种使用方式
| 模式 | 说明 | 适用场景 |
|------|------|----------|
| **连接已有浏览器**(默认推荐) | 连接用户正在使用的 Chrome 浏览器,复用真实的 Cookie、扩展和浏览历史 | 反检测要求高,需要最大程度降低风控风险 |
| **启动新浏览器** | 自动检测并启动一个新的 Chrome/Edge 浏览器实例 | 不需要复用浏览器状态的场景 |
## 快速开始
### 1. 启用CDP模式
### 方式一:连接已有浏览器(默认推荐)
`config/base_config.py` 中设置:
这是**默认且推荐**的方式,直接连接你正在使用的 Chrome 浏览器,反检测效果最好。
#### 第一步:确保 Chrome 版本
需要 Chrome **144 或更高版本**2026年1月起的稳定版均支持。在地址栏输入 `chrome://version` 查看当前版本。
如果版本过低,请前往 [Chrome 官网](https://www.google.com/chrome/) 下载最新版。
#### 第二步:开启远程调试
1. 在 Chrome 地址栏输入:`chrome://inspect/#remote-debugging`
2. 勾选 **"Allow remote debugging for this browser instance"**
3. 页面会显示 `Server running at: 127.0.0.1:9222`,表示已就绪
#### 第三步:运行爬虫
```bash
uv run main.py --platform xhs --lt qrcode --type search
```
运行后Chrome 浏览器会**弹出确认对话框**,点击"接受"即可。程序会等待用户确认默认60秒超时
#### 配置说明
`config/base_config.py` 中的默认配置:
```python
# 启用CDP模式
ENABLE_CDP_MODE = True
# CDP调试端口可选默认9222
# 连接已有浏览器(默认开启
CDP_CONNECT_EXISTING = True
# CDP调试端口与 chrome://inspect 页面显示的端口一致)
CDP_DEBUG_PORT = 9222
# 是否在无头模式下运行建议设为False以获得最佳反检测效果
CDP_HEADLESS = False
# 程序结束时是否自动关闭浏览器
AUTO_CLOSE_BROWSER = True
```
### 2. 运行测试
### 方式二:启动新浏览器
```bash
# 运行CDP功能测试
python examples/cdp_example.py
如果不想连接已有浏览器,可以让程序自动启动一个新的浏览器实例:
# 运行小红书爬虫CDP模式
python main.py
```python
ENABLE_CDP_MODE = True
CDP_CONNECT_EXISTING = False # 关闭连接已有浏览器,改为启动新浏览器
```
## 配置选项详解
@@ -48,7 +77,8 @@ python main.py
| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `ENABLE_CDP_MODE` | bool | False | 是否启用CDP模式 |
| `ENABLE_CDP_MODE` | bool | True | 是否启用CDP模式 |
| `CDP_CONNECT_EXISTING` | bool | True | 是否连接已有浏览器(推荐开启) |
| `CDP_DEBUG_PORT` | int | 9222 | CDP调试端口 |
| `CDP_HEADLESS` | bool | False | CDP模式下的无头模式 |
| `AUTO_CLOSE_BROWSER` | bool | True | 程序结束时是否关闭浏览器 |
@@ -57,8 +87,8 @@ python main.py
| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `CUSTOM_BROWSER_PATH` | str | "" | 自定义浏览器路径 |
| `BROWSER_LAUNCH_TIMEOUT` | int | 30 | 浏览器启动超时时间(秒) |
| `CUSTOM_BROWSER_PATH` | str | "" | 自定义浏览器路径(仅启动新浏览器模式下有效) |
| `BROWSER_LAUNCH_TIMEOUT` | int | 60 | 浏览器连接超时时间(秒) |
### 自定义浏览器路径
@@ -219,15 +249,25 @@ ps aux | grep chrome
## 技术原理
CDP模式的工作原理
### 连接已有浏览器模式(推荐)
1. **用户开启远程调试**: 在 `chrome://inspect/#remote-debugging` 中勾选启用
2. **WebSocket连接**: 程序通过 `ws://localhost:9222/devtools/browser` 直接连接浏览器
3. **用户确认**: Chrome 弹出确认对话框,用户点击接受后连接建立
4. **Playwright集成**: 使用 `connectOverCDP` 方法接管浏览器控制
5. **上下文复用**: 直接使用浏览器已有的上下文包含用户的Cookie、登录状态等
> 💡 与传统CDP模式的区别传统方式通过 `--remote-debugging-port` 启动新浏览器,使用 HTTP 接口 `/json/version` 获取 WebSocket URL。而连接已有浏览器方式直接通过 WebSocket 连接Chrome 新版136+)的远程调试不提供 HTTP 接口,需要用户在浏览器端确认授权。
### 启动新浏览器模式
1. **浏览器检测**: 自动扫描系统中的Chrome/Edge安装路径
2. **进程启动**: 使用`--remote-debugging-port`参数启动浏览器
3. **CDP连接**: 通过WebSocket连接到浏览器的调试接口
3. **CDP连接**: 通过 HTTP 获取 WebSocket URL连接到浏览器的调试接口
4. **Playwright集成**: 使用`connectOverCDP`方法接管浏览器控制
5. **上下文管理**: 创建或复用浏览器上下文进行操作
种方式绕过了传统WebDriver的检测机制提供了更加隐蔽的自动化能力。
种方式绕过了传统WebDriver的检测机制提供了更加隐蔽的自动化能力。连接已有浏览器模式的反检测效果更好,因为使用的是用户真实的浏览器环境。
## 更新日志

View File

@@ -10,7 +10,7 @@ A: windows电脑去网站下载`https://nodejs.org/en/blog/release/v16.8.0` Wind
## xhs登录出现滑块一直验证不通过问题
Q: 小红书扫码登录成功后,浏览器一直在验证滑块,无法登录?<br>
A: 这种情况一般是因为使用playwright浏览器驱动被识别出来的问题,可以尝试删除项目目录下的`brower_data`文件夹,重新走登录流程。<br>
A: 小红书平台风控非常严格,**强烈建议使用 CDP 模式连接自己的真实浏览器**(默认配置),不要使用无痕浏览器或标准 Playwright 模式。连接真实浏览器可以复用已有的 Cookie、登录状态和浏览历史大幅降低被风控检测的概率。如果仍然出现滑块问题,可以尝试删除项目目录下的`brower_data`文件夹,重新走登录流程。<br>
## 如何指定关键词
Q: 可以指定关键词爬取吗?<br>
@@ -43,3 +43,21 @@ A: 打开 config/base_config.py 文件, 找到`ENABLE_GET_WORDCLOUD` 以及`ENAB
## 词云图添加禁用词和自定义词组
Q: 如何给词云图添加禁用词和自定义词组?
A: 打开 `docs/hit_stopwords.txt` 输入禁用词(注意一个词语一行)。打开 config/base_config.py 文件找到 `CUSTOM_WORDS `按格式添加自定义词组即可。<br>
## CDP 连接已有浏览器相关问题
Q: 运行爬虫后提示无法连接到浏览器,报错 `Cannot connect to existing browser on port 9222`<br>
A: 请检查以下几点:<br>
1. 确保 Chrome 浏览器已经打开并正在运行<br>
2. 在 Chrome 地址栏输入 `chrome://inspect/#remote-debugging`,确保已勾选 **"Allow remote debugging for this browser instance"**<br>
3. 页面上应显示 `Server running at: 127.0.0.1:9222`,如果没有显示说明远程调试未成功开启<br>
4. 确保 Chrome 版本 >= 144低版本不支持此功能在地址栏输入 `chrome://version` 查看版本号<br>
Q: 运行爬虫后浏览器弹出了确认对话框,需要怎么操作?<br>
A: 这是正常行为。Chrome 连接已有浏览器时会弹出确认对话框,点击"接受"即可。程序会等待用户确认默认超时时间为60秒在此期间点击确认即可。<br>
Q: 不想连接已有浏览器,想让程序自动启动一个新的浏览器怎么办?<br>
A: 在 `config/base_config.py` 中设置 `CDP_CONNECT_EXISTING = False`,程序会自动检测并启动一个新的 Chrome/Edge 浏览器实例。<br>
Q: 为什么推荐连接已有浏览器而不是启动新浏览器?<br>
A: 连接已有浏览器可以直接复用你浏览器中真实的 Cookie、登录状态、扩展插件和浏览历史平台很难区分这是自动化操作还是真实用户行为**大幅降低被平台风控检测的风险**。而启动新浏览器是一个"干净"的环境,更容易被平台识别为爬虫。<br>