[Django] 스트리밍해온 트윗 DB에 저장하기

김재연·2022년 4월 21일
0

자연재해지도

목록 보기
5/8
post-thumbnail

트윗 자연재해, 지역 구분하기

classify 과정 중에 트윗을 형태소로 쪼개고, 쪼갠 형태소가 지역명이면 그 지역명을 저장하고, 자연재해 키워드에 포함되는 것이면 그 자연재해의 대표단어를 저장하는 방식으로 분류 해놓은 상태다.

# classify.py

queries_xxx = ["xxx", ... ]
region = ["서울", "경기", ... ]

def txt2wak(txt):
    m = Mecab(dicpath='C:/mecab/mecab-ko-dic')

    region_tag = "None"
    disaster_tag = "None"

    for w in m.pos(txt):
        if w[0] in region:
            region_tag = w[0]

    for w in m.pos(txt):
        if w[0] in queries_typhoon:
            disaster_tag = "태풍"
            break
        elif w[0] in queries_downpour:
            disaster_tag = "폭우"
            break
        elif w[0] in queries_snow:
            disaster_tag = "폭설"
            break
        elif w[0] in queries_forestfire:
            disaster_tag = "산불"
            break
        elif w[0] in queries_earthquake:
            disaster_tag = "지진"
            break
        elif w[0] in queries_coldwave:
            disaster_tag = "한파"
            break
        elif w[0] in queries_heatwave:
            disaster_tag = "폭염"
            break
        elif w[0] in queries_dust:
            disaster_tag = "미세먼지"
            break

    return disaster_tag, region_tag

트윗 DB에 저장하기

models.py

# models.py
class DisasterTag(models.Model):
    name=models.CharField(max_length=5)
    def __str__(self):
        return self.name

class Tweet(BaseModel):
    twid = models.TextField()
    time = models.TextField()
    text = models.TextField()
    user = models.TextField()
    disaster_tag = models.ForeignKey(DisasterTag, on_delete=models.CASCADE)
    location = models.ForeignKey(Mark, on_delete=models.CASCADE, null=True, blank=True)

    def __str__(self):
        return str(self.disaster_tag) + " - " + str(self.text)

트윗은 Tweet 모델에 저장하는데, twid, time, text, user는 받아온 값 그대로 넣어주면 되고 자연재해태그와 지역은 ForeignKey를 사용했다. disaster_tag는 DisasterTag라는 모델을 만들어서 DisasterTag에 각 자연재해를 등록해놓으면 하나씩 가져다 끌어쓰는 방식으로 했다. (location은 나중에)


main.py

classify가 끝나면 다음 코드가 실행된다.

# main.py
for twid, time, text, user, disaster, region in zip(twids, times, texts, users, disasters, regions):
if disaster != "None":
	tag_d = DisasterTag.objects.get(name=disaster)
	mark = Mark.objects.get(pk=7)
	tweet = Tweet(
		twid=twid,
		time=time,
		text=text,
		user=user,
		disaster_tag=tag_d,
		location=mark
	)
	tweet.save()
else: # 잘못 들어온 트윗은 저장X
	pass

DisasterTag에서 해당 자연재해 태그에 맞는 모델을 불러와서 (mark는 아직 안했지만 원리는 마찬가지) tweet 모델을 만든 후에 disaster_tag 필드에 넣어주고 tweet.save()를 통해 디비에 저장한다.


장고에 연결해서 파이썬 모듈 실행하기

지금까지 만든 파이썬 모듈을 실행하는 viewset을 만들어 url에 연결하고

# views.py
from .main import tweet_main

class TweetView(APIView):
    def get(self, request):
        tweet_main()
# urls.py
from .views import TweetView

urlpatterns = [
    path('tweet/', TweetView.as_view())
]

외래키 모델 등록하기

disasterTag를 등록해주고 (location도 임시로 등록해주기)


확인하기

http://127.0.0.1:8000/api/tweet/ 로 접속하면 이렇게 트윗이 DB에 쌓인다. (location은 고정)


memo

트윗을 디비에 저장하는데 장고의 모델을 쓰면서 파이썬 모듈만 단독실행하는게 불가능해졌다. 그래서 장고에 url 연결을 해서 실행했는데 그랬더니 import 파일 경로들이 다 꼬여서 새로 써줬는데 뭐 대단한 차이인지는 모르겠다.

❗❗❗ 트윗을 스트리밍하는 main 모듈이 무한루프이기 때문에 http://127.0.0.1:8000/api/tweet/ 에 한번만 접속해도 스트리밍은 멈추지 않는다. 그래서 여기에 계속 접속하면 접속량을 초과했다는 에러창이 뜨니까 주의해야한다. 스트리밍을 끊을 때는 Ctrl+C로 강제종료하고 다시 runserver를 돌린다. ❗❗❗

profile
일기장같은 공부기록📝

0개의 댓글