깃북 : 나만의 웹 크롤러 만들기
이전 글과 마찬가지로 해당 깃북을 가이드 삼았다!
✅ 데이터를 크롤링하기 위해
requests
와bs4
사용
✅ 여러 페이지를 왔다갔다하는 작업을 자동화하기 위해selenium
사용
👉 저장 된 데이터를django DB
에 저장
+) 잘 마무리 될 시,postgreSQL
에 저장하는 방법도 고안해보기
의존성 관리 도구로 poetry
를 사용하였으며,
drf
프로젝트에 적용하였다.
기존에 있는 프로젝트에 적용했기 때문에,
drf
기본 셋팅에 대한 설명은 생략한다.
poetry run py manage.py startapp crawled_data
데이터를 저장해 줄 app
을 만든다.
# settings.py
INSTALLED_APPS = [
...
"crawled_data",
...
]
INSTALLED_APPS
에 새로 만든 app
을 추가해주자.
# 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
라는 모델에 데이터를 저장하고,
이 WordQuiz
를 FK
로 받아 여러개의 옵션을 저장할 수 있게
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
마이그레이션도 꼭 해주자!
받아온 데이터를 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
파일만 실행해도
장고의 기능을 끌어와 쓸 수 있도록
일부 세팅을 해줘야한다.
해당 프로젝트는 dotenv
로 SECRET_KEY
를 숨기고 있기 때문에,
dotenv
파일도 함께 불러와야 한다.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
는 DJANGO_SETTINGS_MODULE
환경 변수를 설정한다.
Django 설정 파일 경로를 지정하기 위해서다.
django
서버를 구동하지 않고 기능을 쓰기 위해 아래에는 django
를 import
해주었다.
그리고 이 모든 과정이 끝난 뒤에서야
crawled_data
의 models
를 끌어올 수 있기 때문에
맨 밑에 적어준다.
.
def crawled_quiz():
...
# data를 담아줄 리스트 생성
data = []
...
data.append(quiz)
...
return data
크롤링 과정을 함수안에 넣어주고, 이번에는 딕셔너리가 아닌 리스트로 data
를 담아준다.
만들어준 quiz
딕셔너리를 data
에 append
해준 뒤,
data
를 return
한다.
.
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
모델에 데이터를 담아주는 과정이다.