공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
2.7 KiB
Python
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")
|