django에서 bs4와 selenium을 이용해 웹 크롤링 하기 - (3)

0v0baek·2023년 6월 8일
0

TIP

목록 보기
6/15
post-custom-banner

도움 받은 글

깃북 : 나만의 웹 크롤러 만들기
이전 글과 마찬가지로 해당 깃북을 가이드 삼았다!

들어가며

✅ 데이터를 크롤링하기 위해 requestsbs4 사용
✅ 여러 페이지를 왔다갔다하는 작업을 자동화하기 위해 selenium 사용
👉 저장 된 데이터를 django DB에 저장
+) 잘 마무리 될 시, postgreSQL에 저장하는 방법도 고안해보기

의존성 관리 도구로 poetry를 사용하였으며,
drf 프로젝트에 적용하였다.

4. 크롤링 데이터 저장을 위한 django 기본 셋팅

기존에 있는 프로젝트에 적용했기 때문에,
drf 기본 셋팅에 대한 설명은 생략한다.

🔎 app 추가

poetry run py manage.py startapp crawled_data

데이터를 저장해 줄 app을 만든다.

# settings.py

INSTALLED_APPS = [
	...
    "crawled_data",
    ...
]

INSTALLED_APPS에 새로 만든 app을 추가해주자.

🔎 DB model 세팅

# crawled_data/models.py

from django.db import models

class WordQuiz(models.Model):
    title = models.CharField(max_length=100)
    explain = models.TextField()
    rate = models.PositiveIntegerField()
    
    def __str__(self):
        return self.title


class WordQuizOption(models.Model):
    quiz = models.ForeignKey(WordQuiz, on_delete=models.CASCADE, related_name="options")
    content = models.CharField(max_length=256)
    is_answer = models.BooleanField()
    
    def __str__(self):
        return f"{self.quiz.id} : {self.content}"

데이터를 저장할 모델을 세팅한다.

WordQuiz라는 모델에 데이터를 저장하고,
WordQuizFK로 받아 여러개의 옵션을 저장할 수 있게
WordQuizOption이라는 모델도 추가로 작성해주자.

# crawled_data/admin.py

from django.contrib import admin
from .models import WordQuiz, WordQuizOption

admin.site.register(WordQuiz)
admin.site.register(WordQuizOption)

django admin 페이지에서 확인하기 위해
admin.py에 모델 등록도 해주자.

.

poetry run py manage.py makemigrations crawled_data
poetry run py manage.py migrate crawled_data 

마이그레이션도 꼭 해주자!

5. Django DB 저장을 위한 코드 리팩토링

받아온 데이터를 Django DB에 저장해주기 위해서는
코드 일부를 리팩토링 해야한다.

# crawler.py

import os
from dotenv import load_dotenv

# dotenv에서 key값을 참조하기 때문에 dotenv를 load 해와야 함
dotenv_path = os.path.join(os.path.dirname(__file__), ".env")
load_dotenv(dotenv_path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")

import django

django.setup()

from crawled_data.models import WordQuiz, WordQuizOption

django 서버를 실행시키지 않고 crawler.py 파일만 실행해도
장고의 기능을 끌어와 쓸 수 있도록
일부 세팅을 해줘야한다.

해당 프로젝트는 dotenvSECRET_KEY를 숨기고 있기 때문에,
dotenv 파일도 함께 불러와야 한다.

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")DJANGO_SETTINGS_MODULE 환경 변수를 설정한다.
Django 설정 파일 경로를 지정하기 위해서다.

django 서버를 구동하지 않고 기능을 쓰기 위해 아래에는 djangoimport해주었다.

그리고 이 모든 과정이 끝난 뒤에서야
crawled_datamodels를 끌어올 수 있기 때문에
맨 밑에 적어준다.

.

def crawled_quiz():

	...
    
    # data를 담아줄 리스트 생성
    data = []
    
    ...
    	
        data.append(quiz)
    
    ...
    
    return data

크롤링 과정을 함수안에 넣어주고, 이번에는 딕셔너리가 아닌 리스트로 data를 담아준다.

만들어준 quiz 딕셔너리를 dataappend해준 뒤,
datareturn한다.

.

if __name__ == "__main__":
    quiz_data = crawled_quiz()
    for quiz in quiz_data:
        my_quiz = WordQuiz(
            title=quiz["title"], explain=quiz["explain"], rate=quiz["rate"]
        )
        my_quiz.save()
        for option in quiz["option"]:
            quiz_option = WordQuizOption(
                quiz=my_quiz, content=option["content"], is_answer=option["is_answer"]
            )
            quiz_option.save()

해당 파일을 직접 실행했을 때만 함수가 호출되도록 하기 위해,
if __name__ == "__main__": 을 사용해준다.

아래는 차례대로 WordQuiz 모델과 WordQuizOption 모델에 데이터를 담아주는 과정이다.

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!
post-custom-banner

0개의 댓글