Skip to content

Commit

Permalink
Merge pull request #182 from develop: 프론트엔드 작업
Browse files Browse the repository at this point in the history
Develop to Master: 프론트엔드 작업
*    대시보드
*    사이드네비게이션
*    위협보고서 추출
*    MUI (다크모드) 적용
  • Loading branch information
simonseo authored Oct 13, 2021
2 parents df63ff7 + dff0422 commit e356f25
Show file tree
Hide file tree
Showing 94 changed files with 3,192 additions and 1,080 deletions.
24 changes: 11 additions & 13 deletions WEB/backend/analyzer-docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,11 @@ services:
extra_hosts:
- "host.docker.internal:host-gateway"
entrypoint: ["/bin/bash","-c"]
# dev only
# command:
# - |
# pip install --no-cache-dir -r /analyzer/requirements.txt
# python -u /crawler/main.py
# python -u /analyzer/analyzer.py
command:
- |
pip install --no-cache-dir -r /analyzer/requirements.txt
python -u /crawler/main.py
python -u /analyzer/analyzer.py
depends_on:
- mongo
- mongo-seed
Expand All @@ -38,10 +37,9 @@ services:
depends_on:
- mongo

# dev only
# analyzer-restarter:
# container_name: analyzer-restarter_service
# image: docker
# volumes: ["/var/run/docker.sock:/var/run/docker.sock"]
# command: ["/bin/sh", "-c", "while true; do sleep 3600; docker restart analyzer_service; done"]
# restart: unless-stopped
analyzer-restarter:
container_name: analyzer-restarter_service
image: docker
volumes: ["/var/run/docker.sock:/var/run/docker.sock"]
command: ["/bin/sh", "-c", "while true; do sleep 3600; docker restart analyzer_service; done"]
restart: unless-stopped
47 changes: 20 additions & 27 deletions WEB/backend/crawler/crawler/crawler.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# for checking elapsed time
import time

# for multiprocess
import asyncio
import aiohttp
Expand All @@ -6,9 +9,6 @@
import requests
from bs4 import BeautifulSoup as bs

# for checking elapsed time
import time

# import class
from crawler.model import Content
from crawler.model import const as const
Expand All @@ -18,9 +18,9 @@

# error
from crawler.error import HTMLElementsNotFoundError as notfound_error
from crawler.error import contentLengthError
from crawler.error import englishContentError
from crawler.error import daterangeError
from crawler.error import contentLengthError as length_error
from crawler.error import englishContentError as english_ban
from crawler.error import daterangeError as date_error

# import setting values
from crawler.setting import DEBUG
Expand All @@ -29,34 +29,33 @@
from crawler.model.siteInstanceServer import get_siteInstance_list

"""
현재 생각하는 flow
'Naver'같은 이름으로 site_instance_selector이용
get_instance_list에서 받아온 'Naver': NaverClass 와 같은 딕셔너리를 통해
crawler에서 직접 클래스 인스턴스(NaverClass)를 크롤링한다.
crawler.py에서 직접 클래스 인스턴스(NaverClass)를 크롤링한다.
각각 사이트별 클래스에는
목록 사이트
컨텐츠 사이트
2가지가 있음
목록 클래스 사이트
컨텐츠 클래스 사이트
전체 사이트
3가지가 있음
목록 사이트에 대한 접근은 url조작을 통해
컨텐츠 사이트에 대한 접근은
목록 사이트에서 태그/클래스 를 통한 스크래핑을 통해 접근
목록 사이트에서 태그/클래스를 통한 스크래핑을 통해 접근
컨텐츠 사이트에서 내용을 읽어내는 것 역시
태그/클래스 식별을 통한 스크래핑이다.
새로운 사이트를 만든다면
1.
model 내부에 Naver와 같은 모듈을 만들고
그 안에 목록 사이트, 컨텐츠 사이트에 대한 것을 ListPage.py, ContentsPage.py를 상속하여
구현 (이름은 뉴스에 국한되지 않을 것이므로 변경할 예정)
그 안에 목록 사이트, 컨텐츠 사이트에 대한 것을 ListPage.py, ContentsPage.py를 상속하여 구현
2.
모듈 내부에 해당 사이트 리스트와 컨텐츠를 읽어오기 위한 json파일 작성
3.
사이트 구조 및 url이 변경된다면 model을 수정
사이트 구조 및 url이 변경된다면 클래스를 수정
html 및 class 이름이 변경된다면 json을 수정
"""

Expand Down Expand Up @@ -95,21 +94,19 @@ async def get_contents(site, contents_url, urlinfo, db):
content_soup = bs(text, 'html.parser')
try:
news_content = Content.contents_factory(site, contents_url, urlinfo, content_soup)
except englishContentError as detail:
except english_ban as detail:
if(DEBUG):
print("english contents")
print(detail)
except contentLengthError as detail:
except length_error as detail:
if(DEBUG):
print("contents does not valid by following exception")
print(detail)
else:
# news_content를 쿼리로 쏘는 코드
if news_content.contents_id not in db.select_id():
db.put_content(news_content)
# print(db.select_id())
except daterangeError:
raise daterangeError
except date_error:
raise date_error
except Exception as detail:
if(DEBUG):
print("an exception occured when getting information of contentsPage")
Expand All @@ -118,8 +115,6 @@ async def get_contents(site, contents_url, urlinfo, db):
if (DEBUG):
print(f"Received request to {contents_url}")

# 나중에는 site뿐만 아니라 subject 역시 매개변수에 넣어서 전달,
# 이후 각 Site 페이지에서 받은 subject 매개변수를 토대로 baseurl을 제작하면 됨
async def crawl(site):
db = database.DB()

Expand All @@ -137,7 +132,7 @@ async def crawl(site):
test_breaker = 0

try:
while prev_page != now_page: # and test_breaker < const.MAX_LISTPAGE_CRAWL:
while prev_page != now_page:
if(DEBUG):
print('\nlisturl: ' + urlbase + str(now_page) + '\n')

Expand Down Expand Up @@ -175,7 +170,6 @@ async def crawl(site):
print(detail)
break

# 일단 마음에 안 들지만 이렇게 해 두었습니다.
if(now_page == prev_page):
break

Expand All @@ -199,11 +193,10 @@ async def crawl(site):
test_breaker += 1
prev_page = now_page
now_page += 1
except daterangeError as detail:
except date_error as detail:
if(DEBUG):
print("crawling over date by following exception")
print(detail)
break

# db.select_all()
db.close()
58 changes: 0 additions & 58 deletions WEB/backend/crawler/crawler/json_generator.py

This file was deleted.

1 change: 0 additions & 1 deletion WEB/backend/crawler/crawler/model/Content.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ def contents_factory(site, contents_page_url, urlinfo, soup):
except AttributeError:
title = "제목이 없습니다."

# 영어 기사인데 제목이 없는 경우는??
if re.search("[가-힣]", title) is None:
raise englishContentError

Expand Down
9 changes: 1 addition & 8 deletions WEB/backend/crawler/crawler/model/const.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@

# 리스트 페이지마다 크롤링 간격 (초)
CRAWLING_LIST_INTERVAL = 3

# 페이지와 페이지 사이마다 크롤링 간격 (초)
CRAWLING_PAGE_INTERVAL = 2
CRAWLING_LIST_INTERVAL = 1

# 크롤링할 날짜 수
CRAWL_DATEAMOUNT = 8

# 테스트용으로 크롤링할 페이지 수 제한
MAX_LISTPAGE_CRAWL = 1
22 changes: 13 additions & 9 deletions WEB/backend/crawler/crawler/model/siteInstanceServer.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
from crawler.model.naver.NaverNewsSite import NaverNewsSite
from crawler.model.dcinside.DCSite import DCSite
from crawler.model.twitter.Twitter import Twitter

def get_siteInstance_list():
ret = {
'naver_news': NaverNewsSite(),
'dcinside': DCSite(),
'twitter': Twitter()
}
ret = { 'naver_news': NaverNewsSite(), 'dcinside': DCSite() }

return ret
import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
Twitter_Secret_Path = os.path.join(BASE_DIR, 'twitter', 'secrets.py')

if os.path.isfile(Twitter_Secret_Path):
from crawler.model.twitter.Twitter import Twitter
ret['twitter'] = Twitter()



def get_siteInstance_list():
return ret

14 changes: 9 additions & 5 deletions WEB/backend/crawler/crawler/setting.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
site_list = {
'NaverNews': 'naver_news',
'DCinside': 'dcinside',
'Twitter': 'twitter'
}
import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
Twitter_Secret_Path = os.path.join(BASE_DIR, 'model', 'twitter', 'secrets.py')

site_list = { 'NaverNews': 'naver_news', 'DCinside': 'dcinside' }

if os.path.isfile(Twitter_Secret_Path):
site_list['Twitter'] = 'twitter'

DEBUG = False
2 changes: 0 additions & 2 deletions WEB/backend/crawler/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,5 @@ async def main():

await asyncio.gather(*futures)



if __name__ == '__main__':
asyncio.run(main())
2 changes: 1 addition & 1 deletion WEB/backend/data/analyzed_sample.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions WEB/backend/drf/detection_status/secret_keywords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
북한,김일성,김정일,김정은,노동당,김여정,미사일,탄도미사일,ICBM,대륙간탄도유도탄,THAAD,사드,대통령,문재인,국군,육군,대한민국육군,해군,대한민국해군,공군,대한민국공군,해병대,합참,국직,국방부직할,국방부,부대,훈련소,소대장,중대장,대대장,연대장,군단장,여단장,사단장,참모장,사령관,제독,참모차장,참모총장,서욱,남영신,부석종,박인호,특전사,707,UDT,SEAL,SSU,SART,CCT,SDT,시진핑,바이든,트럼프,푸틴,스가,기시다,보리스 존슨,마크롱,세르지오 마타렐라,메르켈,쥐스탱 트뤼도,자이르 보우소나르,람 나트 코빈드,현충원,국방홍보원,국방전산정보원,국방대학교,합동군사대학교,국방어학원,국군간호사관학교,국군복지단,고등군사법원,보통군사법원,국방부조사본부,국군교도소,국방부검찰단,국방정신전력원,국방통합데이터센터,국방부군비검증단,국방부군사편찬연구소,국방부유해발굴감식단,군사안보지원사령부,군사안보지원학교,국방보안연구소,국방정보본부,국군정보사령부,777사령부,국방시설본부,주한미군기지이전사업단,국군화생방방호사령부,국군지휘통신사령부,국군수송사령부,국군항만운영단,국군의무사령부,국군강릉병원,국군고양병원,국군대구병원,국군대전병원,국군수도병원,국군서울지구병원,국군양주병원,국군포천병원,국군구리병원,국군춘천병원,국군함평병원,국군홍천병원,국군의무학교,국군병원열차대,의무후송항공대,국군의학연구소,국방부 근무지원단,계룡대 근무지원단,계룡대지구병원,자운대 근무지원단,국군체육부대,국군심리전단,국군재정관리단,국군인쇄창,합동참모본부,합참,지상작전사령부,제2작전사령부,수도방위사령부,육군특수전사령부,육군항공작전사령부,육군미사일사령부,공군작전사령부,한미연합군사령부,한미연합군사령부,연합지상구성군사령부,제2보병사단,제19원정지원사령부,연합해군구성군사령부,연합공군구성군사령부,연합해병구성군사령부,주한 미8군 한국군지원단,1함대,1함대사령부,1함대사,제1해상전투단,제11전투전대,제12전투전대,제13전투전대,제1훈련전대,1전비전대,제1기지방호전대,제1군수전대,제1무기지원대대,제108조기경보전대,동해합동작전지원소,제118조기경보전대,제1함대항공대,1함대항공지원대,포항항만방어대대,2함대,2함대사령부,2함대사,제2해상전투단,제21전투전대,제22전투전대,제23전투전대,제2훈련전대,2전비전대,제2기지방호전대,제2기지지원전대,제2정보통신대대,제2군수전대,제2무기지원대대,제2보급지원대대,제208조기경보전대,인방사,인천해역방위사령부,제27전투전대,제218조기경보대대,3함대,3함대사령부,3함대사,제3해상전투단,제31전투전대,제32전투전대,부상항만방어전대,제3훈련전대,3전비전대,제3기지전대,제3군수전대,제308조기경보전대,제318조기경보전대,제3함대항공대,3함대항공지원대,작전사령부,작전사,해작사,작전사 지휘통신전대,부산기지전대,군수사,군수사령부,정비창,병기탄약창,보급창,군수사 정보통신전대,함정기술연구소,진기사,진해기지사령부,잠수함사,잠수함사령부,제91잠수함전대,제92잠수함전대,제93잠수함전대,제95잠수함전대,제96잠수함전대,제97잠수함전대,제909교육훈련전대,잠수함수리창,잠수함사근무지원대대,제5성분전단,제52기뢰전대,제53상륙전대,제59기동건설전대,제6항공전단,제61해상초계기전대,제611비행대대,제613비행대대,제615비행대대,전술지원대대,제62해상작전헬기전대,제620기지대대,제622비행대대,2함대항공지원대,제625정비대대,제627비행대대,제629비행대대,제63해상기동헬기전대,제631비행대대,제633지휘헬기대대,제65군수전대,제66기지전대,제609교육훈련전대,제1비행교육대대,해상생환훈련대,제7기동전단,제71기동전대,제72기동전대,제77기동군수전대,제주기지전대,제기대,제8전투훈련단,제81해상훈련전대,제82육상훈련전대,예비역함정 관리대대,수상함 인수평가대,특수전전단,특전전대,제1특전대대,제3특전대대,제5특전대대,폭발물처리대대,해난구조전대,교육훈련전대,해군정보단,해군교육사령부,교육사,해군기초군사교육단,기군단,목포해양대학교 학군단,부경대학교 학군단,제주대학교 학군단,한국해양대학교 학군단,해군전투병과학교,전투병과학교,전투교,해군기술행정학교,기술행정학교,기행교,해군정보통신학교,정보통신학교,정통교,실습전대,리더십센터,충무공리더십센터,교욱사 근무지원전대,해군사관학교,생도대,장교교육대대,해양연구소,해사박물관,재경근무지원대대,해군재경근무지원단,재경대대,해양의료원,해의원,포항병원,해군안전단,해군본부,기확관리참모부,전력기획참모부,기참부,인사참모부,인참부,정보작전참모부,정보작전지원참모부,정작부,군수참모부,군참부,정보화기획참모부,정보화기획실,기참부,비서실,감찰실,정책실,공병실,공보정훈실,법무실,군종실,의무실,전력분석시험평가단,전투발전단,전평단,정체단,정보체게관리단,해군군사경찰단,군경단,군사법원,해군역사기록관리단,해기단,전력지원체게사업단,미래혁신연구단,사이버작전센터,해군군악의장대대,해병대사,해병대사령부,서북도방위사령부,제1해병사단,포항특정경비지역사령부,제2해병여단,제3해병여단,제7해병여단,제1해병포병여단,제2해병사단,제1해병여단,제5해병여단,제8해병여단,제2해병포병여단,제6해병여단,제9해병여단,해병대 교육훈련단,제15교육연대,해병대 동원지원단,해병대 항공단,해병대 군수단,연평부대,해병특수수색대,구축함,DDH,DDG,군수지원함,AOE,호위함,FFG,FF,초계함,PCC,상륙함,LPH,LST,유도탄고속함,PKG,기뢰전함,MLS,MSH,MHC,훈련함,ATH,잠수함구조함,ASR,수상함구조함,ATS,잠수정모함,ASL,해양정보함,AGS,고속정,PKM,PKMR,LSF,군수지원정,LCU,잠수함,SS,핵잠수함,참수리,왕참수리,왕참,지통실,지휘통제실,R/S,강감찬함,강경함,강원함,강진함,강화도함,경기함,경남함,고성함,고령함,고준봉함,고창함,공주함,광개토대왕함,광명함,광양함,광주함,김수현함,김좌진함,김창학함,김포함,김화함,나대용함,남포함,남해함,노적봉함,도산안창호함,독도함,동해함,대구함,대전함,대천함,대조영함,대청함,마라도함,문무대왕함,박동진함,박동혁함,박위함,부산함,비로봉함,서울함,서애류성룡함,서후원함,성남함,성인봉함,세종대왕함,소양함,속초함,손원일함,신기원함,신세기함,신돌석함,신성함,안중근함,양만춘함,양양함,영주함,옹진함,왕건함,원산함,원주함,유관순함,윤봉길함,윤영하함,율곡이이함,을지문덕함,이범석함,이병철함,이순신함,이억기함,이종무함,이천함,인천함,일출봉함,임병래함,장보고함,전남함,전병익함,전북함,정긍모함,정운함,정지함,제주함,제천함,조천형함,지덕칠함,천왕봉함,천자봉함,천지함,청주함,청해진함,최무선함,최영함,충무공이순신함,충북함,통영함,포항함,한문식함,한상국함,한산도함,해남함,향로봉함,현시학함,홍대선함,홍범도함,홍성함,홍시욱함,화천함,황도현함,갑판,군사경찰,군악,군종,공병,기관,무장,보급,보수,병기,수송,이발,의무,의장,잠수,전기,전공,전산,전자,전자전,전탐,정보,조리,조타,추기,통기,통신,통정,특전,항공,탈레반,알카에다,오사마 빈 라덴,IS,출항,입항,함행동,당직사관,당직부관,부직사관,발령,전튜휴무,전투체육,입대,피항,편대,피복판매소,피판,항박일지,화생방,훈병,훈련병,이병,이등병,일병,일등병,상병,상등병,병장,현문,현문당직,통신당직,안전당직,조타당직,선임하사,전투배치,RS,셈브레이,당가리,셈당,부식,상륙,영내화,깡깡이
1 change: 1 addition & 0 deletions WEB/backend/drf/detection_status/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
# Analyzed Data Serializer
class AnalyzedDataSerializer(serializers.Serializer):

mode = serializers.CharField(required=True)
category = serializers.CharField(required=True)
period = serializers.IntegerField(required=True)
tags = serializers.DictField(required=True)
Expand Down
Loading

0 comments on commit e356f25

Please sign in to comment.