import requests from bs4 import BeautifulSoup import re # 1. 설정: 스크래핑 대상 URL 및 출력 파일 경로 URL = "https://한국인터넷정보센터.한국/jsp/statboard/IPAS/ovrse/natal/IPaddrBandCurrent.jsp?nationCode1=KR" OUTPUT_FILE = "kor_public_ip_ranges.txt" # Cider가 읽을 수 있는 CIDR 형식 파일 # 2. HTML을 요청하고 응답 내용을 가져오는 함수 def fetch_html(url): """웹 페이지를 요청하고 HTML 내용을 반환합니다.""" try: # User-Agent 헤더 설정 (브라우저처럼 요청) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Safari/537.36" } # 요청 보내기 response = requests.get(url, headers=headers, timeout=10) response.encoding = "utf-8" # 페이지 인코딩 설정 (필요 시 변경) return response.text except Exception as e: print(f"⚠️ 오류: 페이지 요청 중 오류 발생 - {e}") return None # 3. HTML에서 IP 대역 정보를 추출하는 함수 def parse_ip_ranges(html): """HTML 테이블에서 CIDR 형식의 IP 대역 정보를 추출합니다.""" soup = BeautifulSoup(html, "html.parser") table = soup.find("table") # 테이블 태그 찾기 (실제 클래스명 확인 필요) if not table: print("⚠️ 오류: HTML에 테이블 태그가 없습니다.") return [] ip_ranges = [] # 테이블 행을 순회하며 IP 대역 추출 for row in table.find_all("tr")[1:]: # 헤더 행은 건너뛰기 cells = row.find_all("td") # 셀 요소 추출 if len(cells) >= 1: ip_range = cells[1].text.strip() # 첫 번째 셀에서 IP 대역 추출 ip_cider = cells[3].text.strip() ip_range = "allow " + ip_range + ip_cider + ";" print(ip_range) # CIDR 형식 검증 (예: 192.168.0.0/16) #if re.match(r"^\d+\.\d+\.\d+\.\d+/\d+$", ip_range): ip_ranges.append(ip_range) print(f"✅ 성공: {len(ip_ranges)}개의 IP 대역 정보 추출 완료") return ip_ranges # 4. 추출된 IP 대역 정보를 파일로 저장하는 함수 def save_to_file(ip_ranges, filename): """IP 대역 정보를 CIDR 형식의 텍스트 파일로 저장합니다.""" try: with open(filename, "w", encoding="utf-8") as f: for ip in ip_ranges: f.write(f"{ip}\n") print(f"✅ 성공: {filename} 파일 생성 완료") except Exception as e: print(f"⚠️ 오류: 파일 저장 중 오류 발생 - {e}") # 5. 메인 함수: 스크래핑 및 파일 저장 def main(): html = fetch_html(URL) if html: ip_ranges = parse_ip_ranges(html) save_to_file(ip_ranges, OUTPUT_FILE) if __name__ == "__main__": main()