| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- # -*- 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(' (无验证码)')
|