0. Load Map
- front-end와 협업을 하기 위해서 drf로 api 서버를 열어 데이터를 전송(front-end는 React사용)
- Python을 이용해 selenium을 이용해 웹 사이트에서 데이터를 크롤링
- 하지만 이러한 데이터를 체계적으로 관리하려면 DB가 필요
- Python 웹 프레임워크인 django의 Database ORM을 이용해 DB를 만들고 데이터를 저장
- front-end (React)와 통신
1. django 프로젝트 생성
django 기본 사용법은 다음 링크에 정리해둠.
https://lopsided-stallion-c16.notion.site/django-start-b8ad97d4c3434838a00bbd847e7e4cd2?pvs=4
django 기본 start!
간단한 사용법
lopsided-stallion-c16.notion.site
2. Django Start App (장고 앱 만들기)
Django는 프로젝트와 그 안의 앱으로 관리된다. 이 앱은 하나의 기능을 담당하는 단위
python manage.py startapp post
Django Rest Framework (drf 설치)
pip install djangorestframework
settings.py 파일에 INSTALLED_APPS 등록
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#추가된 코드
'post',
'rest_framework',
]
자세한 drf 사용방법은 다음 링크 참고
https://www.django-rest-framework.org/
Home - Django REST framework
www.django-rest-framework.org
dummy_drf / urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('post.urls')),
]
3. parsed_data App Model | parsed_data 앱 모델 만들기
post / models.py
이번 앱의 모델에서는 lecture_name과 teacher과 price라는 column을 가진 Post라는 이름의 Table을 DB에 만들었다.
from django.db import models
class Post(models.Model):
lecture_name = models.TextField(max_length=100) # 강의 이름
#lecture_img = models.ImageField()
teacher = models.CharField(max_length=100) # 강사
#lecture_url = models.TextField(max_length=300) # 강의 사이트 주소
price = models.IntegerField() # 가격
#platform = models.CharField(max_length=100) # 제공 플랫폼
field = models.CharField(max_length=100) # 매핑 1~6 까지
Makemigrations & Migrate | 앱 DB 반영하기
python manage.py makemigrations
python manage.py migrate
4. DRF로 api 서버 세팅
post / serializers.py
DB data를 JSON data로 변환 (ORM, non-ORM 모두)
from .models import Post
from rest_framework import serializers
class serializersPost(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
'직렬화'는 정말 말 그대로 이해하는 것이 좋다.
models에 작성한 폼 그대로 json 형태로 linear하게 보여주는 것.
post / urls.py
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from rest_framework import routers
from . import views
router = routers.DefaultRouter() #DefaultRouter를 설정
router.register('Post', views.PostViewSet) #itemviewset 과 Post이라는 router 등록
urlpatterns = [
path('', include(router.urls)),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
post / views.py
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import serializersPost
from .models import Post
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = serializersPost
post / admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
모델을 admin 계정을 통해 확인하기 위해 등록한다.
서버를 실행 시켜보자
python manage.py runserver

DRF server가 생성되었다.
모델 확인
admin 계정을 하나 만들어준다
python manage.py createsuperuser
admin 페이지로 이동
http://127.0.0.1:8000/admin/

post라는 model이 잘 만들어졌다.
5. 크롤링 코드 가져오기
이전에 만들어둔 크롤링 코드 사용
https://yeongjae.tistory.com/2
[파이썬] selenium 크롤링
1. 환경 설정 팀 프로젝트중 필요한 데이터를 인터넷에서 크롤링해 데이터를 모아 보자 selenium과 bs4을 install pip install selenium pip install bs4 bs4도 크롤링에 사용할 수 있으므로 같이 설치 필요한 라
yeongjae.tistory.com
Django ORM으로 데이터 저장
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dummy_drf.settings")
import django
django.setup()
dummy-drf / test.py
- test.py 파일에 크롤링하는 함수 parser()를 생성
- test.py의 경로는 manage.py파일이 있는 폴더에 생성
- chromedriver도 같은 경로에 생성
Python이 실행될 때 DJANGO_SETTINGS_MODULE이라는 환경 변수에 현재 프로젝트의 settings.py파일 경로를 등록
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dummy_drf.settings")
from selenium import webdriver
from selenium.webdriver.common.by import By
import re
import django
from post.models import Post
django.setup()
def parser():
driver = webdriver.Chrome()
url = 'https://www.inflearn.com/courses?s='
li = ['django','spring','react','c언어','python','java']
all_data = []
for i in range(len(li)):
newdic ={
"lecture_name": "",
#"lecture_img": "",
"teacher": "",
# "lecture_url": "",
"price": "",
#"platform": "",
"field": "" #어떤 분야의 강의를 가져올 것인지 매핑 ex) django=1 , spring=2 ...
}
newurl = url + li[i]
driver.get(newurl) # 접속
#lecture_name
name = driver.find_element(By.XPATH, '//*[@id="courses_section"]/div/div/div/main/div[4]/div/div[1]/div/a/div[2]/div[1]')
newdic["lecture_name"] = name.text
#price
p = driver.find_element(By.XPATH,'//*[@id="courses_section"]/div/div/div/main/div[4]/div/div[1]/div/a/div[2]/div[4]')
p = p.text
pp = re.sub(r"[^0-9]",'', p) # 문자열에서 숫자만 골라내기
newdic["price"]=pp
#teacher
teach = driver.find_element(By.XPATH,'//*[@id="courses_section"]/div/div/div/main/div[4]/div/div[1]/div/a/div[2]/div[2]')
newdic["teacher"] = teach.text
newdic["field"]= i+1
all_data.append(newdic)
return all_data
if __name__=='__main__':
data_dict = parser()
for i in range(len(data_dict)):
dic = data_dict[i]
n = dic['lecture_name']
t = dic['teacher']
p = dic['price']
f = dic['field']
Post(lecture_name=n, teacher=t, price=p, field=f).save()
- all_data에는 list형식으로 각 데이터들이 dictionary 형태로 저장되어있다.
- 이 명령어는 이 파일이 import가 아닌 python에서 직접 실행할 경우에만 아래 코드가 동작하도록 한다.
if __name__=='__main__':
data_dict = parser()
for i in range(len(data_dict)):
dic = data_dict[i]
n = dic['lecture_name']
t = dic['teacher']
p = dic['price']
f = dic['field']
Post(lecture_name=n, teacher=t, price=p, field=f).save()
- 위 코드에서 각 dic 딕셔너리를 순회하면서 n, t, p, f 변수에 강의 이름, 강사 이름, 가격, 분야 정보를 할당. 이때 dic 딕셔너리에서 'lecture_name'와 'teacher' 키에 해당하는 값을 직접 가져와서 n와 t 변수에 (p과 f도 또한) 저장.
- Post(lecture_name=n, teacher=t, price=p, field=f).save() 코드는 각 딕셔너리에 해당하는 정보를 가지고 새로운 Post 모델 레코드를 생성하고 데이터베이스에 저장
test.py 실행
python test.py
저장된 데이터 Django Admin에서 확인하기
우리가 만든 post앱 안에 Post라는 항목이 나와있는 것을 볼 수 있다.

크롤링한 데이터가 잘 들어가 있다.

6. 마무리
json 형식으로 데이터가 잘 들어갔다.
이제 이 데이터를 React(front-end)에서 요청받고 응답 해줄수 있다.

0. Load Map
- front-end와 협업을 하기 위해서 drf로 api 서버를 열어 데이터를 전송(front-end는 React사용)
- Python을 이용해 selenium을 이용해 웹 사이트에서 데이터를 크롤링
- 하지만 이러한 데이터를 체계적으로 관리하려면 DB가 필요
- Python 웹 프레임워크인 django의 Database ORM을 이용해 DB를 만들고 데이터를 저장
- front-end (React)와 통신
1. django 프로젝트 생성
django 기본 사용법은 다음 링크에 정리해둠.
https://lopsided-stallion-c16.notion.site/django-start-b8ad97d4c3434838a00bbd847e7e4cd2?pvs=4
django 기본 start!
간단한 사용법
lopsided-stallion-c16.notion.site
2. Django Start App (장고 앱 만들기)
Django는 프로젝트와 그 안의 앱으로 관리된다. 이 앱은 하나의 기능을 담당하는 단위
python manage.py startapp post
Django Rest Framework (drf 설치)
pip install djangorestframework
settings.py 파일에 INSTALLED_APPS 등록
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#추가된 코드
'post',
'rest_framework',
]
자세한 drf 사용방법은 다음 링크 참고
https://www.django-rest-framework.org/
Home - Django REST framework
www.django-rest-framework.org
dummy_drf / urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('post.urls')),
]
3. parsed_data App Model | parsed_data 앱 모델 만들기
post / models.py
이번 앱의 모델에서는 lecture_name과 teacher과 price라는 column을 가진 Post라는 이름의 Table을 DB에 만들었다.
from django.db import models
class Post(models.Model):
lecture_name = models.TextField(max_length=100) # 강의 이름
#lecture_img = models.ImageField()
teacher = models.CharField(max_length=100) # 강사
#lecture_url = models.TextField(max_length=300) # 강의 사이트 주소
price = models.IntegerField() # 가격
#platform = models.CharField(max_length=100) # 제공 플랫폼
field = models.CharField(max_length=100) # 매핑 1~6 까지
Makemigrations & Migrate | 앱 DB 반영하기
python manage.py makemigrations
python manage.py migrate
4. DRF로 api 서버 세팅
post / serializers.py
DB data를 JSON data로 변환 (ORM, non-ORM 모두)
from .models import Post
from rest_framework import serializers
class serializersPost(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
'직렬화'는 정말 말 그대로 이해하는 것이 좋다.
models에 작성한 폼 그대로 json 형태로 linear하게 보여주는 것.
post / urls.py
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from rest_framework import routers
from . import views
router = routers.DefaultRouter() #DefaultRouter를 설정
router.register('Post', views.PostViewSet) #itemviewset 과 Post이라는 router 등록
urlpatterns = [
path('', include(router.urls)),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
post / views.py
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import serializersPost
from .models import Post
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = serializersPost
post / admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
모델을 admin 계정을 통해 확인하기 위해 등록한다.
서버를 실행 시켜보자
python manage.py runserver

DRF server가 생성되었다.
모델 확인
admin 계정을 하나 만들어준다
python manage.py createsuperuser
admin 페이지로 이동
http://127.0.0.1:8000/admin/

post라는 model이 잘 만들어졌다.
5. 크롤링 코드 가져오기
이전에 만들어둔 크롤링 코드 사용
https://yeongjae.tistory.com/2
[파이썬] selenium 크롤링
1. 환경 설정 팀 프로젝트중 필요한 데이터를 인터넷에서 크롤링해 데이터를 모아 보자 selenium과 bs4을 install pip install selenium pip install bs4 bs4도 크롤링에 사용할 수 있으므로 같이 설치 필요한 라
yeongjae.tistory.com
Django ORM으로 데이터 저장
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dummy_drf.settings")
import django
django.setup()
dummy-drf / test.py
- test.py 파일에 크롤링하는 함수 parser()를 생성
- test.py의 경로는 manage.py파일이 있는 폴더에 생성
- chromedriver도 같은 경로에 생성
Python이 실행될 때 DJANGO_SETTINGS_MODULE이라는 환경 변수에 현재 프로젝트의 settings.py파일 경로를 등록
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dummy_drf.settings")
from selenium import webdriver
from selenium.webdriver.common.by import By
import re
import django
from post.models import Post
django.setup()
def parser():
driver = webdriver.Chrome()
url = 'https://www.inflearn.com/courses?s='
li = ['django','spring','react','c언어','python','java']
all_data = []
for i in range(len(li)):
newdic ={
"lecture_name": "",
#"lecture_img": "",
"teacher": "",
# "lecture_url": "",
"price": "",
#"platform": "",
"field": "" #어떤 분야의 강의를 가져올 것인지 매핑 ex) django=1 , spring=2 ...
}
newurl = url + li[i]
driver.get(newurl) # 접속
#lecture_name
name = driver.find_element(By.XPATH, '//*[@id="courses_section"]/div/div/div/main/div[4]/div/div[1]/div/a/div[2]/div[1]')
newdic["lecture_name"] = name.text
#price
p = driver.find_element(By.XPATH,'//*[@id="courses_section"]/div/div/div/main/div[4]/div/div[1]/div/a/div[2]/div[4]')
p = p.text
pp = re.sub(r"[^0-9]",'', p) # 문자열에서 숫자만 골라내기
newdic["price"]=pp
#teacher
teach = driver.find_element(By.XPATH,'//*[@id="courses_section"]/div/div/div/main/div[4]/div/div[1]/div/a/div[2]/div[2]')
newdic["teacher"] = teach.text
newdic["field"]= i+1
all_data.append(newdic)
return all_data
if __name__=='__main__':
data_dict = parser()
for i in range(len(data_dict)):
dic = data_dict[i]
n = dic['lecture_name']
t = dic['teacher']
p = dic['price']
f = dic['field']
Post(lecture_name=n, teacher=t, price=p, field=f).save()
- all_data에는 list형식으로 각 데이터들이 dictionary 형태로 저장되어있다.
- 이 명령어는 이 파일이 import가 아닌 python에서 직접 실행할 경우에만 아래 코드가 동작하도록 한다.
if __name__=='__main__':
data_dict = parser()
for i in range(len(data_dict)):
dic = data_dict[i]
n = dic['lecture_name']
t = dic['teacher']
p = dic['price']
f = dic['field']
Post(lecture_name=n, teacher=t, price=p, field=f).save()
- 위 코드에서 각 dic 딕셔너리를 순회하면서 n, t, p, f 변수에 강의 이름, 강사 이름, 가격, 분야 정보를 할당. 이때 dic 딕셔너리에서 'lecture_name'와 'teacher' 키에 해당하는 값을 직접 가져와서 n와 t 변수에 (p과 f도 또한) 저장.
- Post(lecture_name=n, teacher=t, price=p, field=f).save() 코드는 각 딕셔너리에 해당하는 정보를 가지고 새로운 Post 모델 레코드를 생성하고 데이터베이스에 저장
test.py 실행
python test.py
저장된 데이터 Django Admin에서 확인하기
우리가 만든 post앱 안에 Post라는 항목이 나와있는 것을 볼 수 있다.

크롤링한 데이터가 잘 들어가 있다.

6. 마무리
json 형식으로 데이터가 잘 들어갔다.
이제 이 데이터를 React(front-end)에서 요청받고 응답 해줄수 있다.
