Programming Language/Python

IP별 국가코드 매칭(feat.오프라인)

D4tai1 2021. 1. 20.

안녕하세요!!

 

오랜만에 노트북에 앉아있는 베짱이입니다.

 

오늘은

IP를 입력해서 국가코드를 조회해볼까합니다

 

그! 러! 나!

귀차니즘이 살그음살그음 다가오고 있네요

호다닥 해보도록 하지요

 

Q. IP에 해당하는 국가코드를 얻어오는 방법은?

 

A1. IP주소를 입력하면 국가코드를 알려주는 사이트도 있고

A2. API를 통해 온라인상에서 얻어올수도 있고

A3. 라이브러리도 있네요

 


Q. 그렇다면 이 세가지의 공통점은?

 

전부 서버에 요청해서 결과를 얻어오는 온라인 방식..!!

그래서 폐쇄망에서는 사용할 수 없다는 치명적인 단점이 있지여..

 

 

Sol. 단점 해결방법(오프라인)!!

IP대역별 국가테이블을 만들어놓고

반복문으로 대역을 비교해서 얻어오려고 합니다.

 

 

Start!!

 

먼저 이 첨부파일은 

IP대역별 국가테이블인데

KISA에서 얻어온 데이터를 바탕으로 정렬을 한번 했습니다

 

겨울철 갓 올린 따땃한 첨부파일

(IP대역별 국가테이블)

info.csv
6.38MB

따땃한 첨부파일을 읽은 후 IP의 국가코드를 출력하는 달달한 소스코드

import time
import logging

def make_logger(name=None):
    # 1 logger instance 생성
    logger = logging.getLogger(name)

    # 2 logger level 설정
    logger.setLevel(logging.INFO)

    # 3 formatter 생성
    formatter = logging.Formatter(" [*] [%(levelname)s] %(asctime)s : %(message)s")

    # 4 handler instance 생성
    console = logging.StreamHandler()

    # 5 handler별 level 설정
    console.setLevel(logging.INFO)

    # 6 handler 출력 format 지정
    console.setFormatter(formatter)

    # 7 logger에 handler 추가
    logger.addHandler(console)

    return logger

# IP의 국가찾기
def Find_Country(ip='1.1.1.1'):
    # logger = make_logger()
    
    # logger.info('국가별 정보 읽어오기')
    raw_sips, raw_dips, raw_countries = [], [], []
    with open('info.csv', 'rt') as fd:
        info = fd.read()


    # logger.info('sip, dip, country 리스트화')
    raw_sips, raw_dips, raw_countries = info.split('\n')
    sips = raw_sips.split(',')
    dips = raw_dips.split(',')
    countries = raw_countries.split(',')

    
    # logger.info('찾을 IP 리스트화')
    ip = list(map(lambda x: int(x), ip.split('.')))

    
    # logger.info('IP의 국가찾기')
    for sip, dip, country in zip(sips, dips, countries):
        sip = list(map(lambda x: int(x), sip.split('.')))
        dip = list(map(lambda x: int(x), dip.split('.')))

        if sip[0] <= ip[0] <= dip[0]:
            # logger.info(sip)
            if sip[1] <= ip[1] <= dip[1]:
                if sip[2] <= ip[2] <= dip[2]:
                    print(' [+] {}.{}.{}.{}({})'.format(ip[0], ip[1], ip[2], ip[3], country))
                    break
                    
start_time = time.time()
Find_Country('216.58.197.174')  # 구글
Find_Country('223.130.195.200') # 네이버
print(' [*] Elapsed Time :', round((time.time() - start_time), 2))  # 소요시간

실행화면

 

[그림1] IP에 해당하는 국가출력

 

에필로그..1

 

로깅은 빼려고 주석처리해놓고..

같이 복사를 해버렸네요..

보는데 나쁘지는 않을거같아서

같이 올리게 되었어요

 

 

 

에필로그..2

 

사실 csv같은구조는 

pandas나 numpy를 이용하면

비교적 간단하게 얻어와서 추출할 수 있지만

라이브러리를 설치해야하기도 하고,

csv라이브러리는 안써봐서..

기본함수를 사용해서 만들었네요

하하..

 

20000!

 

 

 

 

 

'Programming Language > Python' 카테고리의 다른 글

[File_Filter] 파일 분류하는 방법  (0) 2019.08.06
함수 기초  (0) 2018.10.03
데이터 관계분석  (0) 2018.09.30
자료타입  (0) 2018.09.15
파이썬 기본문법  (0) 2018.09.04

댓글