检测行增量:网页棋局新走法检测中缓冲区对比失效问题
解决方案
核心问题是你没保留上一次的走法状态,每次循环都把新值覆盖了buffer,自然没法有效对比。按下面的思路调整:
- 保留历史走法:用独立变量存上一次获取的完整走法,每次新抓取后和这个变量对比。
- 控制请求节奏:别高频请求网站,加个延迟,避免被封IP或触发反爬机制。
- 精准提取走法:如果网页有专门存放棋局的元素(比如带特定class的
<div>/<pre>标签),优先用元素选择器定位,比从整个页面文本里截取靠谱。 - 只展示新增走法:对比新旧走法的差异,拆分出新增的步骤,不用重复打印全部内容。
改进后的代码:
import requests from bs4 import BeautifulSoup import time URL_TEMPLATE = "你的目标URL" last_moves = "" # 存储上一次的完整走法记录 while True: try: r = requests.get(URL_TEMPLATE) r.raise_for_status() # 捕获4xx/5xx类的请求错误 soup = BeautifulSoup(r.text, "lxml") # 优先用元素选择器提取走法(示例:假设走法在class为"game-moves"的pre标签里) moves_element = soup.find("pre", class_="game-moves") if moves_element: current_moves = moves_element.text.partition("*")[0].strip() else: # 保留原文本截取逻辑,同时增加容错 moves_raw = soup.text start_idx = moves_raw.find('1. ') if start_idx == -1: print("未找到棋局走法") time.sleep(5) continue current_moves = moves_raw[start_idx:].partition("*")[0].strip() # 对比新旧走法,输出新增内容 if current_moves != last_moves: # 拆分走法为单步列表,直接提取新增部分 last_steps = last_moves.split() if last_moves else [] current_steps = current_moves.split() new_steps = current_steps[len(last_steps):] if new_steps: print("新增走法:", ' '.join(new_steps)) # 更新历史走法记录 last_moves = current_moves # 间隔5秒再发起下一次请求,可根据实际情况调整时长 time.sleep(5) except Exception as e: print(f"请求出错:{str(e)}") time.sleep(10) # 出错后延长重试间隔
关键说明
- 历史状态保留:
last_moves变量始终存储上一次的完整走法,每次新抓取后先对比是否有变化,避免无效输出。 - 新增走法提取:把走法拆成单步列表,通过长度差直接获取新增部分,只打印新内容,不用重复输出全部走法。
- 容错处理:加入了请求错误捕获和走法未找到的判断,避免程序意外崩溃。
- 请求频率控制:延迟请求既对网站友好,也能降低被拦截的风险。
如果网页结构允许,一定要用元素选择器定位走法容器——页面其他内容的更新可能会干扰文本截取的结果,这也是你之前对比效果差的潜在原因之一。
内容的提问来源于stack exchange,提问作者bigidulka
相关产品推荐
相关产品推荐

