Files
zhaopin/references/windows-remote-scraping.md
T

254 lines
11 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Windows 远程抓取环境配置
## 连接方式
| 网络 | 地址 | 备注 |
|------|------|------|
| **外网(当前)** | `sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143` | 通过内网穿透NAT端口转发,**当前唯一可用** |
| 内网 | `sshadmin@192.168.100.176` | Windows内网IP,外部不可达 |
| ~~旧内网~~ | `~~sshadmin@192.168.50.99~~` | **已失效**(2026-06-22 迁移后) |
SSH 使用 sshpass 密码认证(无密钥认证)。`~/.ssh/config` 中配置了 `Host windows-hr` 别名。
## 环境状态(截至 2025-05-20)
- **环境状态(截至 2025-05-20)**
- **Chrome:** ✅ 已安装(`C:\Program Files\Google\Chrome\Application\chrome.exe`)
- **Node.js:** ✅ v22.18.0 + npm 10.9.3(MSI 静默安装)
- **Playwright:** ✅ playwright-core(`npm install playwright-core`)
- **better-sqlite3:** ✅(`npm install better-sqlite3`)
- **工作目录:** `C:\recruitment\`
- **数据库路径:** `C:\recruitment\recruitment.db`(从 Linux SCP 同步)
- **脚本路径:** `C:\recruitment\zhaopin-scrape.js`(跨平台,通过 `RECRUITMENT_DB` 环境变量指定数据库路径)
## 已完成的部署步骤
```powershell
# 1. 安装 Node.js(MSI 静默安装)
# 下载地址:https://nodejs.org/dist/v22.18.0/node-v22.18.0-x64.msi
msiexec /i node-v22.18.0-x64.msi /quiet /norestart
# 2. 创建工作目录
mkdir C:\recruitment
cd C:\recruitment
npm init -y
# 3. 安装依赖
npm install playwright-core better-sqlite3
# 4. 部署数据库(从 Linux SCP)
# Linux 端:scp ~/.hermes/data/recruitment/recruitment.db sshadmin@192.168.50.99:C:/recruitment/
# 5. 部署脚本(注意跨平台路径处理)
# 脚本通过 process.env.RECRUITMENT_DB 获取数据库路径
# Windows 端设置:set RECRUITMENT_DB=C:\recruitment\recruitment.db
```
## ✅ 已解决:SSH 会话隔离导致 CDP 端口不可达
### 现象
Chrome 通过 SSH 会话以 `--remote-debugging-port=9222` 启动后:
- `netstat -ano | findstr 9222` 显示端口 LISTENING ✅
- `curl http://127.0.0.1:9222/json/version` 连接失败 ❌
### 根因
**Windows Session 隔离** — SSH 会话和 Chrome 进程运行在不同的 Windows 会话中,网络命名空间不共享。
### ✅ 已验证的解决方案:RDP + SSH 端口转发
**实际使用的工作流程(已验证通过):**
1. 用户 RDP 登录 Windows 桌面
2. 在 Windows 桌面用快捷方式启动 Chrome(调试模式 + 独立 user-data-dir)
3. Linux 端建立 SSH 端口隧道:`ssh -N -L 9223:127.0.0.1:9222 sshadmin@192.168.50.99`
4. 脚本在 Linux 上运行,通过 `CDP_PORT=9223` 环境变量连接隧道端口
5. 数据直接写入 Linux 本地 SQLite 数据库,无需同步
**关键细节:**
- 隧道端口用 9223 避免和 Linux 本地 9222 冲突
- Chrome 必须用 `--user-data-dir` 指定独立目录(默认目录被锁定,不能直接用)
- SSH 隧道必须保持连接,断开就失效
- `headless` 模式下 CDP 端口可达,但推荐用桌面模式(用户可可视监控)
### ❌ 已验证无效的方案
| 方案 | 结果 |
|------|------|
| SSH 会话内 `start "" "chrome.exe" --remote-debugging-port=9222` | 进程不启动(session 隔离) |
| SSH 会话内 `powershell Start-Process "chrome.exe" -ArgumentList ...` | 进程不启动(session 隔离) |
| SSH 会话内直接执行 `chrome.exe --remote-debugging-port=9222` | 端口 LISTENING 但不可达 |
| `curl http://127.0.0.1:9222/json/version`(SSH 会话内) | 连接失败 |
| `--remote-allow-origins=*` | 无关,这是 CORS 配置 |
### ✅ 推荐:Windows 计划任务远程启动(2026-06-02 验证)
**Windows 上已配置两个计划任务,可通过 SSH 远程启动浏览器(绕过 session 隔离):**
```bash
# 启动 Chrome Debug(hr1,CDP 9222)
sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"ChromeDebug\""
# 启动 Edge Debug(hr2,CDP 9224)
sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"LaunchEdgeDebug\""
```
**命令:**
| 计划任务名 | 启动内容 |
|-----------|---------|
| `ChromeDebug` | `"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222` |
| `LaunchEdgeDebug` | `"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9224 --user-data-dir=C:\temp\edge-debug` |
**原理:** 计划任务在桌面 session(Session 1)中执行,与 RDP 登录同 session,所以 GUI 进程能正常启动且 CDP 端口可达。`start` 和 `Start-Process` 通过 SSH(Session 0)执行,进程要么不启动要么 CDP 不可达。
**验证步骤(Edge 启动后需 ~6 秒才能 CDP 就绪):**
```bash
sleep 6
ssh sshadmin@192.168.50.99 "curl -s --connect-timeout 5 http://127.0.0.1:9224/json/version"
# 应返回 {"Browser":"Edg/148.0.3967.96",...,"webSocketDebuggerUrl":"ws://..."}
```
**Edge 启动后默认只打开空白 newtab 页**,需要通过 CDP 导航到推荐页或用户在桌面手动操作。
## Edge 启动方式(双账号 hr2)
### 安装路径
```
C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
```
### ⚠️ Windows 用户目录实际路径(2026-06-26 确认)
通过 SSH `echo %USERPROFILE%` 确认实际用户目录为 `C:\Users\sshadmin.WIN-3NKO8I5R9IJ`(不是 `C:\Users\sshadmin`)。
- Chrome user-data-dir 应检查是否也需要更新(当前配置为 `C:\temp\chrome-debug`)
- Edge user-data-dir 需用完整路径:`C:\Users\sshadmin.WIN-3NKO8I5R9IJ\AppData\Local\Microsoft\Edge\UserData-hr2`
- **路径中避免空格**(用 `UserData-hr2` 不用 `User Data hr2`),PowerShell `Start-Process -ArgumentList` 解析含空格路径时可能出错
### 远程启动(推荐:schtasks)
```bash
# 通过 SSH 用计划任务启动(绕过 session 隔离)
sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"LaunchEdgeDebug\""
sleep 6 # Edge 启动较慢
```
**⚠️ 计划任务 `LaunchEdgeDebug` 的 user-data-dir 可能需要更新:** 当前配置为 `C:\temp\edge-debug`,需在 Windows 上检查该目录是否还存在,必要时更新为 `C:\Users\sshadmin.WIN-3NKO8I5R9IJ\AppData\Local\Microsoft\Edge\UserData-hr2`。
### ❌ SSH 远程启动 Edge(已确认无效,pitfalls #74)
通过 SSH 用 `powershell Start-Process` 或 `cmd /c start` 启动 Edge:
- 进程可能启动(`tasklist` 可见 msedge.exe)
- 端口可能短暂 LISTENING
- 但 **CDP 端口不可达**(curl 返回空或连接失败)
- 端口 LISTENING 后会自动释放(Edge 在 Session 0 中运行异常)
- **即使是 `powershell Start-Process` 也会失败** — 2026-06-26 实测确认
**根因:** SSH 登录在 Session 0(services session),Edge 启动在 Session 0 而非桌面 Session 1。GUI 进程在 Session 0 中 CDP 端口不稳定,会短暂监听后释放。
**唯一可靠远程方式:`schtasks /run`**(计划任务在桌面 session 执行)。
### 桌面快捷方式(备选)
> ⚠️ **2026-06-02 发现:桌面无 Edge Debug.lnk 快捷方式**,只有 Chrome Debug.lnk。计划任务 `LaunchEdgeDebug` 是唯一远程启动方式。如需创建快捷方式:
```powershell
$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("C:\Users\Administrator\Desktop\Edge Debug.lnk")
$Shortcut.TargetPath = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
$Shortcut.Arguments = "--remote-debugging-port=9224 --user-data-dir=C:\temp\edge-debug"
$Shortcut.Save()
```
### ⚠️ Edge 同样受 Windows Session 隔离限制
通过 SSH 会话远程 `Start-Process` 启动的 Edge,CDP 端口 9224 虽然显示 LISTENING 但**不可达**,和 Chrome 完全相同的问题。**必须通过计划任务或桌面快捷方式启动**。详见上方"已验证无效方案"章节。
### 验证 CDP 连通性
```bash
# Linux 端,通过隧道验证
curl -s --connect-timeout 5 http://127.0.0.1:9225/json/version
# 应返回 JSON,含 Browser 字段为 "Microsoft Edge/..."
```
## Chrome 启动方式
### 方式1:桌面快捷方式(推荐,已验证)
在 Windows 桌面创建快捷方式,用户双击启动:
```powershell
# 通过 SSH 创建桌面快捷方式(一次性)
$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut('C:\Users\Administrator\Desktop\Chrome Debug.lnk')
$Shortcut.TargetPath = 'C:\Program Files\Google\Chrome\Application\chrome.exe'
$Shortcut.Arguments = '--remote-debugging-port=9222 --user-data-dir=C:\temp\chrome-debug'
$Shortcut.Save()
```
**⚠️ user-data-dir 必须用独立目录:** Chrome 默认的 User Data 目录被已运行的 Chrome 实例锁定,直接使用会报错。必须先复制一份:
```powershell
# 首次使用:复制默认 Chrome 配置(保留登录态和 Cookie)
robocopy "C:\Users\Administrator\AppData\Local\Google\Chrome\User Data" "C:\temp\chrome-debug" /E
```
### 方式2:SSH 命令行启动
```powershell
# headless 模式(SSH 会话内 CDP 端口可达,但用户看不到浏览器)
& "C:\Program Files\Google\Chrome\Application\chrome.exe" --headless=new --remote-debugging-port=9222 --user-data-dir=C:\temp\chrome-debug
```
## Linux 端操作
```bash
# 1. 建立 SSH 端口隧道(后台运行,保持连接)
ssh -N -L 9223:127.0.0.1:9222 sshadmin@192.168.50.99 &
# 2. 验证 CDP 连接
curl -s http://localhost:9223/json/version
# 3. 运行抓取脚本(通过环境变量指定端口)
cd /home/kt/scripts && CDP_PORT=9223 node zhaopin-scrape.js 20
```
## 数据存储
**当前方案:脚本在 Linux 运行,数据直接写入 Linux 本地数据库,无需同步。**
- 数据库路径:`/home/kt/.hermes/data/recruitment/recruitment.db`
- Windows 上不需要维护数据库副本
- 脚本通过 `RECRUITMENT_DB` 环境变量自动检测系统并使用对应路径(Linux 默认,Windows 通过环境变量覆盖)
## 网络环境限制(重要)
**⚠️ Windows 机器无法插网线(用户确认 2026-06-01),WiFi 是唯一网络方式。**
| 项目 | 值 |
|------|------|
| WiFi 网卡 | Qualcomm QCA9565 802.11b/g/n |
| 连接 AP | HUAWEI-2.4G-HHVT (2.4GHz, 频道1) |
| 信号强度 | ~34% |
| 链路速度 | 72.2 Mbps |
| 以太网口 | Realtek PCIe GbE,状态 Disconnected(不可用) |
**影响:** 2.4GHz WiFi 信号弱 + 干扰大 → SSH 隧道间歇性断连。物理层无法优化。
**应对措施(三层防御):**
1. SSH 双向保活(ServerAliveInterval=15 + ClientAliveInterval=30)
2. `ssh-tunnel-watchdog.sh` 隧道守护(每10秒检测,断了自动重建)
3. `batch-runner.js` 内置 `waitForCdpRecovery()`(CDP断开等5分钟恢复,不直接停止)
## 注意事项
1. Windows SSH 服务器是 OpenSSH for Windows,部分 Linux 命令不可用
2. 路径分隔符是 `\\`,脚本中注意跨平台兼容
3. PowerShell 和 CMD 行为不同,脚本中优先用 Node.js API 而非 shell 命令
4. Windows 防火墙可能阻止 CDP 端口(9222),需确认放行
5. SSH 端口隧道的本地端口用 9223(避免和 Linux 本地 9222 冲突)
6. Chrome `--user-data-dir` 必须是独立目录,默认目录被锁定
7. SSH 隧道必须保持连接,断开后脚本无法连接 Chrome
8. Windows 端 PowerShell 转义引号复杂,建议通过 `powershell -Command "..."` 执行
9. 脚本通过 `CDP_PORT` 环境变量指定 CDP 端口,默认 9222