편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2020.10.23

    크롤링한 내용 Django DB 저장 관련 질문드려요


    안녕하세요, 파이썬 및 장고 웹개발이 처음이라 질문이 있어서 글을 씁니다. 질문 수준이 너무 허접해도 양해부탁드리겠습니다.

    이번에 처음으로 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()로 바꾸어 실행해 보았는데 바뀐 영화의 전체 행이 한줄 더 추가되는 현상이 발생하였습니다.

    제가 원하는 것은 파일을 실행하였을 때 기존의 모든 데이터는 날리고 새로운 데이터가 입력이 되거나 변경된 부분의 내용만 수정되기를 원하는데 아무리 검색을 해봐도 잘 나오지가 않아 이렇게 질문을 드립니다. 좋은 아이디어나 참고할 사항을 알려주시면 감사하겠습니다.

  • 프로필 ilalf님의 편집
    날짜2019.10.24

    크롤링한 내용 Django DB 저장 관련 질문드려요


    안녕하세요, 파이썬 및 장고 웹개발이 처음이라 질문이 있어서 글을 씁니다. 질문 수준이 너무 허접해도 양해부탁드리겠습니다.

    이번에 처음으로 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()로 바꾸어 실행해 보았는데 바뀐 영화의 전체 행이 한줄 더 추가되는 현상이 발생하였습니다.

    제가 원하는 것은 파일을 실행하였을 때 기존의 모든 데이터는 날리고 새로운 데이터가 입력이 되거나 변경된 부분의 내용만 수정되기를 원하는데 아무리 검색을 해봐도 잘 나오지가 않아 이렇게 질문을 드립니다. 좋은 아이디어나 참고할 사항을 알려주시면 감사하겠습니다.