정보보안 실무에서는 정책, 실제점검, 운영 등도 중요하지만 보안사고나 이슈를 빨리 확인하는 부분도 중요하다. 사고나 이슈 관련 뉴스를 통해 현재 운영하는 조직이나 시스템에 해당 문제점이 있진 않는지 파악하고 적시에 조치를 해야 하기 때문이다. 또한 사고사례를 재가공하여 임직원을 대상 내부 교육 자료로 활용 할 수 있다.
때문에 보안담당자, 실무자들은 메일링 서비스나 뉴스레터를 구독하고 있는 경우가 많다. 하지만 특정 업체나, 언론사 뉴스레터 서비스는 광고등에 의해 리포트 내용이 달라지는 경우가 있다. 이럴경우 담당자가 전체 언론사를 대상으로 자체적으로 뉴스를 수집하여 관련 정보를 취합 할 수 있다면 다양한 각도에서 생각해 볼 수 있는 좋은 토대가 될것이다.
지난 포스팅에서 작성한 코로나, 부동산 관련 뉴스 수집 코드를 조금 변경해 보안뉴스를 수집하는 코드를 만들었다. 이번엔 해당 코드를 조금 바꾸어 하루치(24시간)의 정보보안, 정보보호 뉴스를 수집하는 코드를 작성했다. 지난번과 똑같이 네이버 검색 API를 사용했으며 개발과정에서 달라지거나 추가된 부분들은 아래와 같다
- Naver 검색 API 1회 Response 값인 100개를 초과하는 기사들에 대한 수집코드 추가
- 실행시간 기준 하루치의 기사만 수집 할 수 있도록 기사 작성 시간을 판별하는 Calc_Date 함수
- Response JSON 값에서 원하는 데이터만 선별처리 하는 Get_Data 함수 (검색어, 기사타이틀, 기사요약, 링크, 날짜)
- 선별된 JSON 값을 DataFrame을 사용해 정제하여 출력
해당 코드를 스케줄러에 등록하여 매일 새벽에 돌아가게 한다면 매일 관련 뉴스들을 수집 할 수 있다. 정규식으로 제외 키워드를 설정하고 엑셀, 메일로 발송하는 코드를 추가해 고도화 하면 더 효과적으로 사용 할 수 있다.
수집대상 세팅 : 정보보안, 정보보호 키워드와 출력갯수, 정렬방법, 카테고리 설정 코드
def Security_Main():
json_result = []
req_query = ['정보보안', '정보보호']
req_display = '100'
req_sort = 'date'
req_target = ['news'] # 네이버 뉴스
Search_Main(req_target, req_query, req_display, req_sort, json_result)
수집기능 Main : 정보보안 관련 뉴스 수집을 위한 값들을 요청하고 편집하는 main 코드
def Search_Main(req_target, req_query, req_display, req_sort, json_result):
nStart = 0
for target_url in req_target: # 검색섹션을 정한다
json_result.clear()
for target_query in req_query: # 검색 키워드를 정한다
check_today = 0
target_query = target_query.rstrip('\n')
print("\nKeyword is " + target_url + "_" + target_query + ".......")
json_search = Set_Search_Option(target_url, target_query, 1, req_display, req_sort)
if (json_search == None):
json_result.append({'Keyword': "", 'Title': "", 'Description': "", 'Link': "", 'Date': ""})
continue
while ((json_search != None) and (json_search['display'] != 0)):
for post_data in json_search['items']:
if (post_data['originallink'] != None):
date_result = Calc_Date(post_data)
if (date_result == 0):
Get_Data(post_data, json_result, target_query)
else:
pd.set_option('display.max_columns', 5)
pd.set_option('display.width', 5000)
df = pd.DataFrame(json_result)
print(df)
check_today = 1
break
tmp_nStart = nStart
nStart = json_search['start'] + json_search['display']
if (nStart == 1001 or (
nStart - json_search['start']) < 100 or tmp_nStart == nStart or check_today == 1):
break
json_search = Set_Search_Option(target_url, target_query, nStart, req_display, req_sort)
날짜계산 : 현재시간으로부터 1일(24시간 기준)으로 작성된 기사 수집 코드
def Calc_Date(post_data):
date_result = datetime.strptime(post_data['pubDate'], '%a, %d %b %Y %H:%M:%S +0900')
now_time = datetime.now()
calc_time = now_time - date_result
if (calc_time.days == 0 and math.floor(calc_time.seconds / 3600) < 24):
ret_calc = 0
else:
ret_calc = 1
return ret_calc
검색 요청 URL 옵션 세팅 : MAIN에서 받아온 정보로 요청 URL을 만들어 주고 json 형식으로 리턴해주는 코드
def Set_Search_Option(target_url, search_keyword, page_start, display, sort):
sleep(0.1)
url = furl('https://openapi.naver.com/v1/search/' + target_url)
url.args['query'] = search_keyword
url.args['display'] = display
url.args['sort'] = sort
url.args['start'] = page_start
ret_data = Get_Search_Result(url)
if (ret_data == None):
return None
else:
return json.loads(ret_data)
검색 Request : 위에서 최종적으로 세팅된 모든 결과를 취합하여 Request를 보내는 코드
def Get_Search_Result(req_url):
request = urllib.request.Request(req_url)
request.add_header("X-Naver-Client-Id", client_id)
request.add_header("X-Naver-Client-Secret", client_secret)
try:
response = urllib.request.urlopen(request)
rescode = response.getcode()
if (rescode == 200):
return response.read().decode('utf-8')
except Exception as e:
print(e)
print("Error Code:" + str(req_url))
return None
데이터 선별 : 요청에 의해 Response 되는 값중 필요한 부분만 선별하는 코드
def Get_Data(post, jsonResult, query):
title_result = post['title']
description_result = post['description']
link_result = post['link']
date_result = datetime.strptime(post['pubDate'], '%a, %d %b %Y %H:%M:%S +0900')
col_date = date_result.strftime('%Y-%m-%d %H:%M')
jsonResult.append({'Keyword': query, 'Title': title_result,
'Description': description_result, 'Link': link_result, 'Date': col_date})
return
[정보보안 기사 수집 Code]
import urllib.request
from furl import furl
import json
import math
from time import sleep
import pandas as pd
# 날짜, 파일명 세팅을 위한 import
import datetime
from datetime import datetime
# Navet API KEY
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
def Security_Main():
json_result = []
req_query = ['정보보안', '정보보호']
req_display = '100'
req_sort = 'date'
req_target = ['news'] # 네이버 뉴스
Search_Main(req_target, req_query, req_display, req_sort, json_result)
def Search_Main(req_target, req_query, req_display, req_sort, json_result):
nStart = 0
for target_url in req_target: # 검색섹션을 정한다
json_result.clear()
for target_query in req_query: # 검색 키워드를 정한다
check_today = 0
target_query = target_query.rstrip('\n')
print("\nKeyword is " + target_url + "_" + target_query + ".......")
json_search = Set_Search_Option(target_url, target_query, 1, req_display, req_sort)
if (json_search == None):
json_result.append({'Keyword': "", 'Title': "", 'Description': "", 'Link': "", 'Date': ""})
continue
while ((json_search != None) and (json_search['display'] != 0)):
for post_data in json_search['items']:
if (post_data['originallink'] != None):
date_result = Calc_Date(post_data)
if (date_result == 0):
Get_Data(post_data, json_result, target_query)
else:
pd.set_option('display.max_columns', 5)
pd.set_option('display.width', 5000)
df = pd.DataFrame(json_result)
print(df)
check_today = 1
break
tmp_nStart = nStart
nStart = json_search['start'] + json_search['display']
if (nStart == 1001 or (
nStart - json_search['start']) < 100 or tmp_nStart == nStart or check_today == 1):
break
json_search = Set_Search_Option(target_url, target_query, nStart, req_display, req_sort)
def Calc_Date(post_data):
date_result = datetime.strptime(post_data['pubDate'], '%a, %d %b %Y %H:%M:%S +0900')
now_time = datetime.now()
calc_time = now_time - date_result
if (calc_time.days == 0 and math.floor(calc_time.seconds / 3600) < 24):
ret_calc = 0
else:
ret_calc = 1
return ret_calc
# 검색 결과를 얻어옴
def Set_Search_Option(target_url, search_keyword, page_start, display, sort):
sleep(0.1)
url = furl('https://openapi.naver.com/v1/search/' + target_url)
url.args['query'] = search_keyword
url.args['display'] = display
url.args['sort'] = sort
url.args['start'] = page_start
ret_data = Get_Search_Result(url)
if (ret_data == None):
return None
else:
return json.loads(ret_data)
# 검색 요청 보냄
def Get_Search_Result(req_url):
request = urllib.request.Request(req_url)
request.add_header("X-Naver-Client-Id", client_id)
request.add_header("X-Naver-Client-Secret", client_secret)
try:
response = urllib.request.urlopen(request)
rescode = response.getcode()
if (rescode == 200):
return response.read().decode('utf-8')
except Exception as e:
print(e)
print("Error Code:" + str(req_url))
return None
# 필요한 데이터만 선별
def Get_Data(post, jsonResult, query):
title_result = post['title']
description_result = post['description']
link_result = post['link']
date_result = datetime.strptime(post['pubDate'], '%a, %d %b %Y %H:%M:%S +0900')
col_date = date_result.strftime('%Y-%m-%d %H:%M')
jsonResult.append({'Keyword': query, 'Title': title_result, 'Description': description_result, 'Link': link_result, 'Date': col_date})
return
Security_Main()
[실행결과]
'Programming > Project' 카테고리의 다른 글
파이썬으로 홈택스 사업자등록상태조회 프로그램 만들기 (0) | 2020.05.29 |
---|---|
네이버 검색 API를 이용한 코로나, 부동산 뉴스 검색 - with Python (0) | 2020.04.03 |
네이버 Open API 로 단축 URL 생성하기 (0) | 2020.03.10 |
파이썬 & Nmap 으로 Anonymous FTP 찾기 (0) | 2020.03.09 |
네이버 파파고 API로 번역 프로그램 만들기 by Python (0) | 2020.02.26 |