# -*- coding: utf-8 -*- """공주시 227~414행 재검수 적용. 규칙(226행 검수 캘리브레이션 결과): R1 관광지 dongList(tursmCn): L 페이지->게시판, M=썸네일수 R2 게시판 글수 재계산: M=현재 크롤 글수 (board_count 있는 행, 값이 다를 때만) R3 찾아오시는길/오시는길: N=어문,이미지 DRY 기본. --write 시 백업 후 저장. """ import sys, json, shutil import openpyxl XLSX = r'D:\01.프로젝트\DB수집\작업파일\광역_사이트맵\충청남도\2.공주시\충청남도_공주시.xlsx' EV = r'D:\01.프로젝트\DB수집\_스크립트\_evidence.json' LO, HI = 227, 414 def main(): write = '--write' in sys.argv ev = json.load(open(EV, encoding='utf-8')) wb = openpyxl.load_workbook(XLSX) ws = wb.active changes = [] # (row, col, colname, old, new, rule) drift = [] # 미세 드리프트(원본 유지) 보고용 for r in range(LO, HI + 1): e = ev.get(str(r)) if not e: continue url = (ws.cell(r, 11).value or '') L = ws.cell(r, 12).value M = ws.cell(r, 13).value N = ws.cell(r, 14).value Gname = ws.cell(r, 7).value or '' Fname = ws.cell(r, 6).value or '' name = '%s %s' % (Fname, Gname) # R1 관광지 dongList if 'tursmCn' in url and e.get('tursm_count'): tc = e['tursm_count'] if L != '게시판': changes.append((r, 12, 'L', L, '게시판', 'R1관광지')) if M != tc: changes.append((r, 13, 'M', M, tc, 'R1관광지')) continue # 관광지는 M 규칙2 적용 안함 # R2 게시판 글수 재계산 (0/빈 값만 복구; 유효 비0값의 미세 드리프트는 원본 유지) if L == '게시판' and e.get('board_count') is not None: bc = e['board_count'] if (M in (None, 0, '0')) and bc: changes.append((r, 13, 'M', M, bc, 'R2게시판글수복구')) elif M != bc: drift.append((r, M, bc, ws.cell(r, 7).value or ws.cell(r, 6).value or '')) # R3 찾아오시는길 N if ('찾아오시는' in name) or ('오시는길' in name) or ('오시는 길' in name): if N == '어문': changes.append((r, 14, 'N', N, '어문,이미지', 'R3오시는길')) # report print('=== 제안 변경 %d건 (DRY) ===' % len(changes)) by = {} for r, c, cn, old, new, rule in changes: by.setdefault(rule, []).append((r, cn, old, new)) for rule in sorted(by): print('\n[%s] %d건' % (rule, len(by[rule]))) for r, cn, old, new in by[rule]: g = ws.cell(r, 7).value or ws.cell(r, 6).value or ws.cell(r, 5).value or '' print(' r%d %s: %r -> %r (%s)' % (r, cn, old, new, g)) if drift: print('\n[미세 드리프트: 원본 유지, 참고용] %d건' % len(drift)) for r, old, new, g in drift: print(' r%d 게시판글수 원본 %s (현재 크롤 %s, 차이 %+d) %s' % (r, old, new, new - (old or 0), g)) if write: bak = XLSX.replace('.xlsx', '_backup_재검수227전.xlsx') shutil.copy(XLSX, bak) for r, c, cn, old, new, rule in changes: ws.cell(r, c).value = new wb.save(XLSX) print('\n저장 완료. 백업:', bak) else: print('\n(DRY — 적용하려면 --write)') if __name__ == '__main__': main()