DB_JOB/작업파일/공공기관2/_hf_cat2.py
hehihoho3 df16c98366 백업: DB수집 전체 스냅샷 (공공기관2 정리 전)
공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 18:15:40 +09:00

51 lines
2.7 KiB
Python

# -*- coding: utf-8 -*-
"""고유(36~42)·즐겨찾는(24~35) 카테고리별 건수 — 페이저 마지막offset+행수로 총계."""
import sys, io, json, re
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
from playwright.sync_api import sync_playwright
JOBS = {
"고유정보목록": ("https://www.hf.go.kr/ko/sub06/sub06_04_02.do",
[("전체",""),("주택구입","36"),("주택보증","37"),("주택연금","38"),("유동화증권","39"),("신용회복","40"),("재무","41"),("기타","42")]),
"즐겨찾는목록": ("https://www.hf.go.kr/ko/sub06/sub06_04_03.do",
[("전체",""),("감사","24"),("윤리","25"),("기획","26"),("재정","27"),("법무","28"),("노무","29"),("인사","30"),("총무","31"),("회계","32"),("정보화","33"),("홍보","34"),("대외","35")]),
}
CNT_JS = """
() => {
const t=document.body.innerText;
let m=t.match(/총\\s*([0-9,]+)\\s*건/)||t.match(/전체\\s*:?\\s*([0-9,]+)/);
// 페이저 마지막 offset
let lastOff=0;
document.querySelectorAll('a').forEach(a=>{const h=a.getAttribute('href')||'';const mm=h.match(/article\\.offset=([0-9]+)/);if(mm)lastOff=Math.max(lastOff,+mm[1]);});
const rows=document.querySelectorAll('table tbody tr').length;
return JSON.stringify({txt:m?m[1].replace(/,/g,''):null, lastOff, rows});
}
"""
out={}
with sync_playwright() as p:
br=p.chromium.launch(headless=True)
pg=br.new_context(ignore_https_errors=True,viewport={'width':1600,'height':1000}).new_page()
for bname,(burl,cats) in JOBS.items():
out[bname]={"url":burl,"cats":[]}
for cname,cv in cats:
u=f"{burl}?mode=list&srCategoryId={cv}" if cv else f"{burl}?mode=list"
try:
pg.goto(u,wait_until='domcontentloaded',timeout=20000); pg.wait_for_timeout(700)
r=json.loads(pg.evaluate(CNT_JS))
# 마지막 페이지로 가서 총계 확정
tot=r['txt']
if tot is None and r['rows']>0:
if r['lastOff']>0:
pg.goto(f"{u}&article.offset={r['lastOff']}&articleLimit=5",wait_until='domcontentloaded',timeout=20000); pg.wait_for_timeout(500)
last_rows=pg.evaluate("()=>document.querySelectorAll('table tbody tr').length")
tot=str(r['lastOff']+last_rows)
else:
tot=str(r['rows'])
except Exception as e:
tot=None; r={'err':str(e)[:30]}
out[bname]["cats"].append({"name":cname,"v":cv,"tot":tot})
print(f" {bname} {cname}({cv}): {tot}")
br.close()
json.dump(out,open("_hf_cat2.json","w",encoding="utf-8"),ensure_ascii=False,indent=1)
print("saved")