크롤링한 내용 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 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    기존 데이터 모두 날리기: 그런 작업을 일반적으로 TRUNCATE라고 합니다. 테이블의 구조는 그대로 두고 내용을 초기화하는 명령입니다.

    변동이 있는 자료만 업데이트하기: update_or_create에 조건을 잘 부여하셔야 할 겁니다. if X then update else create 방식일 게 뻔한데, 여기서 X 조건문이 뭔가 불완전하면 전부 create 삼천포로 빠집니다.

    더 생각해 보기: 저라면 크롤링하는 대상(여기서는 영화)의 고유번호를 찾거나 만들어서 그걸 DB에 같이 저장하겠습니다. 나중에는 그 고유번호에 해당하는 자료를 새로 크롤링했을 때, 그 고유번호에 해당하는 테이블의 자료만, 새로 크롤링해 온 값으로 UPDATE SET 해서 엎어치면 되겠지요.

    고지가 코앞입니다. 힘내세요.

    • 말씀대로 all().delete()로 초기화 시켰어요! 근데 나중에는 더 생각해보기에 말씀하신 것도 도전해보려구요! 정말 감사합니다. ilalf 2019.10.24 16:25

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)