DB_JOB/작업파일/완료/광역_사이트맵/충청남도/9.서천군/_enum.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

62 lines
2.1 KiB
Python

import requests, sys, re, json
from bs4 import BeautifulSoup
import urllib3
urllib3.disable_warnings()
sys.stdout.reconfigure(encoding='utf-8')
base = 'https://www.seocheon.go.kr'
path = '/prog/ioCateData/kor/sub01_02_02/list.do'
H = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
def get(u):
r = requests.get(u, headers=H, timeout=25, verify=False)
r.encoding = r.apparent_encoding or 'utf-8'
return r.text
def total_of(soup):
m = re.search(r'Total\s*:\s*([\d,]+)', soup.get_text())
return int(m.group(1).replace(',','')) if m else None
def slave_list(soup):
out=[]
ul = soup.select_one('ul.slave_tab')
if not ul: return out
for li in ul.select('li'):
a=li.find('a')
if not a: continue
txt=' '.join(li.get_text().split())
href=a.get('href','')
cc=re.search(r'cate_cd=(\w+)', href)
out.append((cc.group(1) if cc else '', txt, base+href))
return out
# basic tabs
soup0 = BeautifulSoup(get(base+path), 'html.parser')
basics=[]
for li in soup0.select('ul.basic_tab li'):
a=li.find('a');
if not a: continue
txt=' '.join(li.get_text().split())
href=a.get('href','')
bc=re.search(r'cate_b_cd=(\w+)', href)
basics.append((bc.group(1) if bc else '', txt, base+href))
result=[]
for bcd, btxt, burl in basics:
bsoup = BeautifulSoup(get(burl), 'html.parser')
slaves = slave_list(bsoup)
if not slaves:
t = total_of(bsoup)
result.append({'b':bcd,'btxt':btxt,'cate':'','ctxt':'','url':burl,'total':t})
print(f'{bcd} {btxt[:30]:30} | (no slave) Total={t}')
else:
for ccd, ctxt, curl in slaves:
csoup = BeautifulSoup(get(curl), 'html.parser')
t = total_of(csoup)
result.append({'b':bcd,'btxt':btxt,'cate':ccd,'ctxt':ctxt,'url':curl,'total':t})
print(f'{bcd} {btxt[:24]:24} | {ccd} {ctxt[:18]:18} Total={t}')
with open('_enum_result.json','w',encoding='utf-8') as f:
json.dump(result,f,ensure_ascii=False,indent=2)
print('TOTAL leaves:', len(result), 'sum:', sum((x['total'] or 0) for x in result))