
whoscored.com 采用 incapsula 反爬与动态 js 渲染双重防护,直接 http get 无法获取浏览器中“查看源代码”所见的 json 数据;需借助 headless 浏览器执行页面 js 并提取嵌入 dom 的真实数据。
whoscored.com 采用 incapsula 反爬与动态 js 渲染双重防护,直接 http get 无法获取浏览器中“查看源代码”所见的 json 数据;需借助 headless 浏览器执行页面 js 并提取嵌入 dom 的真实数据。
Whoscored.com 是全球最权威的足球数据平台之一,其比赛详情页(如 https://www.whoscored.com/Matches/614052/Live)在浏览器中呈现丰富结构化数据——包括实时事件流、球员热图、传球网络及关键 JSON 块(通常位于 <script> 标签内或 window.__whoscoredData 全局变量中)。但正如问题中所揭示:通过 Go 的 http.Get() 获取的 HTML 与浏览器“查看源代码”结果严重不一致,原因在于:
- 页面初始 HTML 仅为骨架,核心数据由 JavaScript 异步加载并动态注入 DOM;
- Whoscored 使用 Incapsula(现为 Imperva)WAF,会检测非浏览器请求头、无 Cookie 上下文、缺失 JS 执行环境等特征,直接返回混淆脚本(如你看到的十六进制字符串解密逻辑)或拦截响应;
- 真实 JSON 数据并非来自静态接口,而是经前端 JS 解密、解析、挂载后才存在于 document 或 window 对象中。
✅ 正确路径:使用 Headless 浏览器驱动(而非纯 HTTP 客户端)完整模拟用户行为——加载页面 → 执行所有 JS → 等待数据就绪 → 提取内存中的 JSON。
推荐方案:Go + Chrome DevTools Protocol(CDP)或 WebLoop
虽然 Selenium WebDriver 在 Go 中支持有限,但更轻量、高性能且原生适配 Go 的方案是基于 Chrome DevTools Protocol (CDP) 的库,例如 chromedp(官方维护、活跃、文档完善),它无需外部 WebDriver 二进制,直接与本地 Chrome/Edge 实例通信。
✅ 示例:用 chromedp 提取 Whoscored 比赛页中的 JSON 数据
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/chromedp/chromedp"
)
func main() {
// 启动 headless Chrome(需提前安装 Chrome 或 Chromium)
ctx, cancel := chromedp.NewExecAllocator(context.Background(),
chromedp.ExecPath("/usr/bin/chromium-browser"), // Linux 示例路径,请按系统调整
chromedp.Flag("headless", ""),
chromedp.Flag("disable-gpu", ""),
chromedp.Flag("no-sandbox", ""),
chromedp.Flag("disable-dev-shm-usage", ""),
)
defer cancel
// 创建浏览器上下文
ctx, cancel = chromedp.NewContext(ctx)
defer cancel
// 设置超时(Whoscored 加载较慢,建议 ≥15s)
ctx, cancel = context.WithTimeout(ctx, 20*time.Second)
defer cancel
var htmlContent string
var jsonData string
err := chromedp.Run(ctx,
chromedp.Navigate(`https://www.whoscored.com/Matches/614052/Live`),
// 等待关键元素出现(如 match-centre 容器),确保 JS 已执行
chromedp.WaitVisible(`#match-centre`, chromedp.ByQuery),
// 提取页面最终渲染后的 HTML(含 JS 注入内容)
chromedp.OuterHTML("html", &htmlContent, chromedp.ByQuery),
// ✅ 关键:执行 JS 获取挂载的全局 JSON 数据(Whoscored 常用 window.__whoscoredData 或类似变量)
chromedp.Evaluate(`(function(){
if (typeof window.__whoscoredData !== 'undefined') {
return JSON.stringify(window.__whoscoredData);
}
// 若未找到,尝试从 script 标签中正则提取 JSON 字符串
const scripts = document.querySelectorAll('script');
for (let s of scripts) {
if (s.textContent && s.textContent.includes('"matchId":')) {
const jsonMatch = s.textContent.match(/({.*?"matchId".*?});?\s*$/s);
if (jsonMatch && jsonMatch[1]) return jsonMatch[1];
}
}
return null;
})()`, &jsonData),
)
if err != nil {
log.Fatal("Execution failed:", err)
}
fmt.Printf("✅ HTML length: %d bytes\n", len(htmlContent))
if jsonData != "null" && len(jsonData) > 100 {
fmt.Printf("✅ Successfully extracted JSON (first 200 chars): %s...\n", jsonData[:min(200, len(jsonData))])
} else {
fmt.Println("⚠️ Warning: JSON not found — may require custom JS injection or cookie handling")
}
}
func min(a, b int) int {
if a < b {
return a
}
return b
}? 依赖安装:
go mod init whoscored-fetcher go get github.com/chromedp/chromedp
⚠️ 重要注意事项
-
反爬对抗升级:Whoscored 会检测自动化工具指纹(如 navigator.webdriver、chrome.runtime 等)。chromedp 默认启用 --disable-blink-features=AutomationControlled,但仍建议添加以下规避措施:
chromedp.Flag("disable-blink-features", "AutomationControlled"), chromedp.Flag("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."), - Cookie 与会话维持:首次访问需接受 GDPR 弹窗,并可能生成 Incapsula 验证 Cookie。建议复用同一 chromedp.Context 处理多页请求,或手动保存/加载 Cookie。
-
更优替代方案(生产推荐):
若需大规模、高稳定性采集,优先使用封装完善的开源项目,例如 Python 生态的 soccerdata(已内置 WhoScored 支持):from soccerdata import WhoScored ws = WhoScored(league="ENG-Premier League", season="2021") events = ws.read_events(match_id=614052) # 自动处理 JS 渲染与反爬
其底层即采用 Playwright/Selenium 封装,持续维护反爬策略更新。
总结
| 方法 | 是否可行 | 优点 | 缺点 |
|---|---|---|---|
| http.Get() + 正则提取 | ❌ 失败 | 轻量、快 | 被 Incapsula 拦截,无 JS 执行能力 |
| Selenium + Go bindings | ⚠️ 可行但繁琐 | 兼容性好 | 维护成本高、性能差、Go 生态弱 |
| chromedp(CDP) | ✅ 推荐 | 原生 Go、高性能、可控性强 | 需本地 Chrome、需处理指纹 |
| soccerdata / foot-spider 等成熟库 | ✅✅ 首选 | 开箱即用、反爬鲁棒、社区支持 | 语言绑定(Python/Go)、需适配业务逻辑 |
结论:不要试图“破解” Incapsula 加密脚本——它会持续升级。拥抱 Headless 浏览器本质,用 chromedp 或成熟数据包,以合法、可持续、低维护的方式获取 Whoscored 的高质量 JSON 数据。


















