You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Scraping问题:采集板球实时比分时重复返回已获取的历史值

解决方案

  • 清理DOM解析器内存残留
    simple_html_dom解析器存在内存未主动释放就会残留历史解析内容的已知问题,单次脚本多次执行采集逻辑时极易读取到旧值。需要在每次解析前后主动清理对象,同时新增HTTP头强制中间节点不缓存:
clearstatcache();
$url = 'https://www.example.in/scoreboard';

// 销毁上次的解析对象,避免残留
if (isset($cricket)) {
    $cricket->clear();
    unset($cricket);
}

// 新增HTTP头强制不缓存
$context = stream_context_create([
    'http' => [
        'header' => "Cache-Control: no-store, no-cache, must-revalidate\r\nPragma: no-cache\r\n"
    ]
]);

$cricket = file_get_html($url . '?nocache='. time(), false, $context);
  • 优化DOM匹配逻辑,避免命中隐藏的历史节点
    不要直接取全局第一个.team-score元素,页面中通常会有隐藏的历史比分节点、往期赛事节点也使用了同名class,plaintext会读取隐藏元素的内容。建议先定位到实时比分的专属父容器,再向下查找比分元素,同时过滤隐藏节点:
$score = '';
// 先定位实时比分父容器,示例id为live-board,可根据实际HTML结构调整
$live_board = $cricket->find('#live-board', 0);
if ($live_board) {
    $score_el = $live_board->find('.team-score', 0);
    // 过滤隐藏的元素
    $style = $score_el->getAttribute('style');
    if (strpos($style, 'display:none') === false && strpos($style, 'visibility:hidden') === false) {
        $score = trim($score_el->plaintext);
    }
}
  • 增加比分有效性校验
    如果目标站点使用多节点负载均衡,不同节点的比分更新存在秒级同步延迟,也会导致请求到未更新的节点返回旧值。你可以本地存储上一次的有效比分,若本次采集到的比分逻辑上早于上一次有效比分(比如比分数值更低、和上2次的结果完全重复),就判定为无效值,跳过存储或者间隔1秒后重试采集。

内容的提问来源于stack exchange,提问作者shakky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:27:03