(Django) 스크래핑한 데이터 장고 DB에 넣기
가장 먼저 할 일은 장고를 세팅해주는 것이다 :-)
django settings
가상환경을 만들어준다 : virtualenv venv
장고를 install 한다(가상환경 안에서 설치해야한다!) : pip install django
적절한 네임으로 프로젝트와 앱을 만들어준다 : django-admin startproject config ./ django-admin startapp scrapping
settings.py에 설치한 앱을 적어야 하는 것 잊지말자
1. 데이터 스크래핑하는 로직 py 만들기
가장 먼저 데이터를 스크래핑해서 딕셔너리 형태로 가져오는 로직을 장고의 manage.py의 위치와 동일하게 만든다. 아래의 로직은 인사이트 기사를 스크래핑해오는 로직이다.
길고 복작해보이지만 사실 꽤나 간단한 로직들이다..^^ 여기서 중요한건 아래의 로직보다는 원하는 데이터를 스크래핑해서 딕셔너리에 담는것이 중요하다
코드 전체 보러가기
# ./insight_parser.py
insight_news_info = []
# Dict형태로 변환 함수
def dict_infor(**kwargs):
context = {}
for k,v in kwargs.items():
context[k] = v
return context
def parse_insight():
cnt = 0 # 뉴스 number
data = {}
i = 0
.
.
.
# 데이터 스크래핑해오는 과정....
insight_news_info = dict_infor(
press=press,
news_code=code,
news_category=news_category,
date=date,
preview_img=preview_img,
title=title,
content=content.text,
img=image_url_list,ref=link
)
i += 1
data[i] = insight_news_info # 모든 데이터가 담긴 딕셔너리 data
return data
2. 1번에서 만든 py파일을 models.py와 연동해준다. (장고 환경 불러오기)
연동하기 위한 로직은 아래와 같다.
이렇게 로직이 추가되면 해당 파일을 python으로 실행시켜도 manage.py를 통해 장고를 실행시킨것 같이
작동한다. 그렇기 때문에 insight_parser.py에서 create되는 model이 정상적으로 장고 db에 들어가진다.
파이썬이 실행될때 DJANGO_SETTINGS_MODULE이라는 환경 변수에 현재 프로젝트의 settings.py 경로를 등록한다 이때 앱네임.settings로 작성해야 한다
장고를 import해서 장고 프로젝트를 사용할 수 있게 한다
# ./insight_parser.py
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "scrapping.settings") - 1
import django - 2
django.setup()
from scrapping.models import Article
3. 장고 orm으로 데이터 db에 저장하기
if name==’main’: 이 코드를 작성해야 python에서 직접 실행할 경우에만 아래의 코드들이 동작된다.
코드를 살펴보면 Article을 create하는 걸 볼 수 있다. python insight_parser.py
의 명령어로
파일을 실행시킨다. 아무런 에러가 나지 않으면 성공 -!
# ./insight_parser.py
if __name__=='__main__':
news_dict = parse_insight()
for v in news_dict.values():
Article.objects.create(
press=Press.objects.filter(name=v['press']).first(),
category=Category.objects.filter(name=v['news_category']).first(),
code=v['news_code'],
date=v['date'],
preview_img=v['preview_img'],
title=v['title'],
img=v['img'],
content=v['content'],
ref=v['ref']
)
👏 model 작성에 어려움이 있는 경우
아직 모델링 설계에 경험이 부족하다. 모델링 설계가 어렵다면 남들이 짜놓은 코드를 많이보자. 그리고 직접 왜 그렇게 짰는지에 대해 고민하고 스스로 짜는 시간을 가진다면 최소한 돌아가는데 문제는 없는 모델을 짤 수 있을 것이다
class Category(models.Model):
name = models.CharField(max_length=64)
def __str__(self):
return self.name
class Press(models.Model):
name = models.CharField(max_length=64)
def __str__(self):
return self.name
class Article(models.Model):
press = models.ForeignKey(Press, on_delete=models.CASCADE, related_name='article')
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='article')
code = models.CharField(max_length=32)
date = models.CharField(max_length=64)
preview_img = models.TextField()
img = models.TextField()
title = models.TextField()
content = models.TextField()
ref = models.URLField()
def __str__(self):
return self.title