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
相关产品推荐
相关产品推荐

