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

11 KiB
Executable File
Raw Blame History

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 环境变量指定数据库路径)

已完成的部署步骤

# 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 隔离):

# 启动 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 就绪):

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)

# 通过 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 是唯一远程启动方式。如需创建快捷方式:

$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 连通性

# Linux 端,通过隧道验证
curl -s --connect-timeout 5 http://127.0.0.1:9225/json/version
# 应返回 JSON,含 Browser 字段为 "Microsoft Edge/..."

Chrome 启动方式

方式1:桌面快捷方式(推荐,已验证)

在 Windows 桌面创建快捷方式,用户双击启动:

# 通过 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 实例锁定,直接使用会报错。必须先复制一份:

# 首次使用:复制默认 Chrome 配置(保留登录态和 Cookie)
robocopy "C:\Users\Administrator\AppData\Local\Google\Chrome\User Data" "C:\temp\chrome-debug" /E

方式2:SSH 命令行启动

# 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 端操作

# 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