# -*- coding: utf-8 -*- """两次验证码之间的爬取量: 用交叉验证日志(带时间戳)分桶统计""" import json import re from collections import Counter from datetime import datetime from pathlib import Path recs = [] for ln in Path('logs/cross_validate.jsonl').read_text(encoding='utf-8').splitlines(): if not ln.strip(): continue r = json.loads(ln) m = re.search(r'screenshots[/\\]+([^/\\]+)[/\\]step3', r.get('image', '')) r['dev'] = m.group(1) if m else '?' r['dt'] = datetime.strptime(r['ts'], '%Y-%m-%d %H:%M:%S') recs.append(r) print(f'交叉日志共 {len(recs)} 条') print('按设备分布:', dict(Counter(r['dev'] for r in recs))) def parse_day(day): out = {} for f in Path('logs').glob('captcha_log_*.txt'): dev = f.stem.replace('captcha_log_', '') ts = [datetime.strptime(m.group(1), '%Y-%m-%d %H:%M:%S') for ln in f.read_text(encoding='utf-8', errors='ignore').splitlines() if ln.startswith(day) for m in [re.match(r'(\S+ \S+)', ln)] if m] if ts: out[dev] = sorted(ts) return out for day in ['2026-09-15', '2026-09-14']: caps = parse_day(day) day_recs = [r for r in recs if r['dt'].strftime('%Y-%m-%d') == day] print(f'\n===== {day} 两次验证码之间的爬取量 =====') for dev, ts in sorted(caps.items(), key=lambda x: -len(x[1])): dev_recs = [r for r in day_recs if r['dev'] == dev] print(f'{dev} ({len(ts)}次验证码, 交叉解析{len(dev_recs)}屏):') for i in range(len(ts)): t0 = ts[i] t1 = ts[i + 1] if i + 1 < len(ts) else ts[i].replace(hour=23, minute=59) inwin = [r for r in dev_recs if t0 <= r['dt'] < t1] rows = sum(r.get('final', 0) for r in inwin) print(f' 第{i+1}次{t0.strftime("%H:%M")} → {"第" + str(i + 2) + "次" + t1.strftime("%H:%M") if i + 1 < len(ts) else "结束"}: 解析{len(inwin)}屏, 识别{rows}行') if not ts: print(' (无验证码)')