크롤링한 내용 Django DB 저장 관련 질문드려요
조회수 1128회
안녕하세요, 파이썬 및 장고 웹개발이 처음이라 질문이 있어서 글을 씁니다. 질문 수준이 너무 허접해도 양해부탁드리겠습니다.
이번에 처음으로 Django 및 python 으로 웹페이지를 만들어봤는데요,
다른 웹사이트를 크롤링하여 그 내용을 제가 만든 장고의 게시판 형식으로 보여주는 것을 만들었습니다.
회사 업무라 그대로 보여드리지는 못하지만 최대한 비슷하게 예를 들자면 네이버 영화정보 사이트를 크롤링하여 아래와 같이 보여지는 게시판을 만든것과 비슷합니다.
영화제목 | 감독 | 배우 | 평점 |
---|---|---|---|
어벤져스 | 홍길동 | 로다주, 아이언맨 | 9.0 |
어벤져스2 | 고길동 | 아이언맨 | 9.5 |
models.py의 코드는
from django.db import models
# Create your models here.
class Movie(models.Model):
movie_name = models.CharField(max_length=100)
director = models.CharField(max_length=20)
actor = models.CharField(max_length=3)
grade = models.CharField(max_length=50)
registred_dttm = models.DateTimeField(auto_now_add=True,verbose_name='time')
def __str__(self):
return self.project_name
입니다.
그리고 웹페이지를 크롤링한 정보를 리스트 형으로 만들어서 위 각각의 테이블에 저장하는 파이썬 코드를 만들었습니다.
import requests
from bs4 import BeautifulSoup as bs
import re
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gerrit_project.settings")
import django
django.setup()
from .models import Movie
def parse_movie():
.
.
.
.
return movie_list
#네이버 영화로 예를 들었기 때문에 크롤링해서 저장하는 코드는 입력하지 않았습니다. 크롤링한 정보를 list형으로 아래와 같이 return받게 코드를 짯습니다.
[['아이언맨', '홍길동', ['로다주','아이언맨'],'9.0'], ['아이언맨2', '홍길동', ['로다주','아이언맨'],'9.1'], ................]
if __name__=='__main__':
blog_data_dict = parse_movie()
for i in range(len(blog_data_dict)):
Movie(movie_name=blog_data_dict[i][0], direct=blog_data_dict[i][1], actor=blog_data_dict[i][2], grade=blog_data_dict[i][3]).save()
이제 궁금한 점은 db를 갱신하는 방법입니다.
예를들어 영화의 평점이 어제와 달라졌을 때 위의 파일을 한번 더 실행하면 기존 데이터는 그대로 유지되고 다시 전체 크롤링한 데이터가 쌓이는 현상이 발생하고 update_or_create()로 바꾸어 실행해 보았는데 바뀐 영화의 전체 행이 한줄 더 추가되는 현상이 발생하였습니다.
제가 원하는 것은 파일을 실행하였을 때 기존의 모든 데이터는 날리고 새로운 데이터가 입력이 되거나 변경된 부분의 내용만 수정되기를 원하는데 아무리 검색을 해봐도 잘 나오지가 않아 이렇게 질문을 드립니다. 좋은 아이디어나 참고할 사항을 알려주시면 감사하겠습니다.
1 답변
-
기존 데이터 모두 날리기: 그런 작업을 일반적으로
TRUNCATE
라고 합니다. 테이블의 구조는 그대로 두고 내용을 초기화하는 명령입니다.변동이 있는 자료만 업데이트하기:
update_or_create
에 조건을 잘 부여하셔야 할 겁니다.if X then update else create
방식일 게 뻔한데, 여기서X
조건문이 뭔가 불완전하면 전부create
삼천포로 빠집니다.더 생각해 보기: 저라면 크롤링하는 대상(여기서는 영화)의 고유번호를 찾거나 만들어서 그걸 DB에 같이 저장하겠습니다. 나중에는 그 고유번호에 해당하는 자료를 새로 크롤링했을 때, 그 고유번호에 해당하는 테이블의 자료만, 새로 크롤링해 온 값으로
UPDATE SET
해서 엎어치면 되겠지요.고지가 코앞입니다. 힘내세요.
댓글 입력