티스토리 뷰
파이썬으로 각종 빅데이터 크롤링/분석/시각화 결과를
쟝고(STS pyDev) 프레임워크로 만들기
>> 기존의 pyweb_board 사용
[메인 페이지]templates : main.html
-main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>빅데이터 처리</h2>
{% if request.user.is_authenticated %}
<h3><a href="logout">({{user.username}})logout</a></h3>
{% else %}
<h3><a href="login_form">로그인</a></h3>
{% endif %}
<h3><a href="list">게시판</a></h3>
<h3><a href="movie_save">네이버 영화 평점 크롤링</a></h3>
<h3><a href="chart">네이버 영화 평균평점 차트 그리기</a></h3>
<h3><a href="wordcolud">워드 클라우드 작성</a></h3>
<h3><a href="cctv_map">부산진구 CCTV 위치 지도 작성</a></h3>
</body>
</html>
-urls.py 등록
urlpatterns = [
path('', views.home),
...
]
-views.py
#main.html 연결
#웹 페이지에서 localhost 호출했을 때 연결할 페이지 설정
def home(request):
return render(request, 'main.html')
-웹페이지 확인
>d:
>cd D:\work\django\pyweb_board
>python manage.py runserver localhost:80 #서버 실행
-결과
파이썬으로 했던 빅데이터(크롤링, 분석, 시각화 등)을
쟝고 프레임워크로 표현하기
pyweb_board 프로젝트 사용
1. 네이버 영화 평점 크롤링
(1) 파이썬 모듈 만들기
[ board ] 패키기 우클릭 -> new -> pyDev Module : BigdataPro
(2) BigdataPro.py
-크롤링하는 코드 작성 : python에서 jupyter lab에서 썼던 코드들
'''
Created on 2022. 7. 8.
@author: admin
'''
import requests
from bs4 import BeautifulSoup
def movie_crawling(data):
for i in range(1, 101):
#네이버 영화 평점/리뷰 페이지의 url 복사
base='https://movie.naver.com/movie/point/af/list.naver?&page=' #기본 주소
url = base + str(i) #for문 돌면서 각 페이지
req = requests.get(url)
if req.ok:
html = req.text #req: html 태그 #req.text : html 태그의 텍스트
soup = BeautifulSoup(html, 'html.parser')
titles = soup.select('.title > a.movie')
points = soup.select('.title em')
contents = soup.select('.title')
n = len(titles)
for i in range(n):
title = titles[i].get_text()
point = points[i].get_text()
contentArr = contents[i].get_text().replace('신고', '').split('\n\n')
content = contentArr[2].replace('\t', '').replace('\n', '')
data.append((title, point, content)) #튜플이 여러 개인 리스트 생성
print(title, point, content)
#만든 것은 views.py에서 호출
(3) models.py
-movie 모델 만들기
class Movie(models.Model):
idx = models.AutoField(primary_key=True)
title = models.CharField(null=False, max_length=500)
content = models.TextField(null=False)
point = models.IntegerField(default=0)
(4) views.py
크롤링한 것을 호출하여 작업 수행 : DB 저장
#크롤링한 것 DB 저장
def movie_save(request):
data = []
BigdataPro.movie_crawling(data)
#데이터를 하나씩 저장
for row in data:
dto = Movie(title=row[0], point=row[1], content=row[2])
dto.save()
return redirect('/')
(5) urls.py
-호출
urlpatterns = [
path('', views.home),
path('movie_save/', views.movie_save),
...
]
(6) 웹페이지 확인
-모듈 생성했기 때문에
####CMD
>python manage.py makemigrations
####결과
Migrations for 'board':
board\migrations\0002_movie.py
- Create model Movie
>python manage.py migrate
>python manage.py runserver localhost:80
(6-1) 웹페이지에서 '네이버 영화 평점 크롤링' 링크 클릭하면
크롤링이 진행됨. CMD에서 명령을 수행하고 있는 것을 볼 수 있음.
(6-2) mySQL 확인 : py_web / board_movie
2. 평점 차트 / 워드클라우드 / CCTV 지도
(1) BigdataPro.py
-전체 코드
'''
Created on 2022. 7. 8.
@author: admin
'''
from collections import Counter
import os
from anaconda_project import plugins
import pandas as pd
from bs4 import BeautifulSoup
import folium
from konlpy.tag._okt import Okt
from matplotlib import font_manager
from matplotlib.pyplot import rc
import pytagcloud
import requests
import matplotlib.pyplot as plt
from pyweb_board.settings import STATIC_DIR
#네이버 영화 평짐/리뷰 크롤링
def movie_crawling(data):
for i in range(1, 101):
#네이버 영화 평점/리뷰 페이지의 url 복사
base='https://movie.naver.com/movie/point/af/list.naver?&page=' #기본 주소
url = base + str(i) #for문 돌면서 각 페이지
req = requests.get(url)
if req.ok:
html = req.text #req: html 태그 #req.text : html 태그의 텍스트
soup = BeautifulSoup(html, 'html.parser')
titles = soup.select('.title > a.movie')
points = soup.select('.title em')
contents = soup.select('.title')
n = len(titles)
for i in range(n):
title = titles[i].get_text()
point = points[i].get_text()
contentArr = contents[i].get_text().replace('신고', '').split('\n\n')
content = contentArr[2].replace('\t', '').replace('\n', '')
data.append((title, point, content)) #튜플이 여러 개인 리스트 생성
print(title, point, content)
#만든 것은 views.py에서 호출
#네이버 영화 평균평점 차트 그리기
def makeGraph(titles,points):
font_path="c:\Windows/fonts/malgun.ttf"
font_name=font_manager.FontProperties(fname=font_path).get_name()
rc('font',family=font_name)
plt.title("영화 평점")
plt.xlabel("영화 제목")
plt.ylabel('평균평점')
plt.grid(True)
plt.bar(range(len(titles)),points, align='center')
plt.xticks(range(len(titles)),list(titles),rotation=90)
plt.savefig(os.path.join(STATIC_DIR,'images/fig01.png'),dpi=300)
#워드 클라우드 작성
def makeWordCloud(contents):
nlp=Okt()
fontname=''
wordtext=""
for t in contents:
wordtext+=str(t)+" "
nouns=nlp.nouns(wordtext)
count=Counter(nouns)
wordInfo=dict()
for tags, counts in count.most_common(100):
if(len(str(tags)) > 1):
wordInfo[tags]=counts
filename=os.path.join(STATIC_DIR,'images/wordcloud01.png')
taglist=pytagcloud.make_tags(dict(wordInfo).items(),maxsize=80)
pytagcloud.create_tag_image(taglist,filename, size=(800,600),
fontname='Korean', rectangular=False)
# webbrowser(img)
#부산진구 CCTV 위치 지도 작성
def cctv_map():
popup=[]
data_lat_lng=[]
a_path='c:/pgm/'
df=pd.read_csv(os.path.join(a_path,'CCTV.csv'),encoding='CP949')
print(pd)
for data in df.values:
if data[4] > 0:
popup.append(data[1])
data_lat_lng.append([data[10],data[11]])
m=folium.Map([35.16242332,129.0441629],zoop_start=14)
plugins.MarkerCluster(data_lat_lng,popups=popup).add_to(m)
m.save(os.path.join(TEMPLATE_DIR,'map/map01.html'))
(2) settings.py
-
...
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_DIR = os.path.join(BASE_DIR, 'board/templates') #추가
...
STATIC_URL = '/board/static/'
STATIC_DIR = os.path.join(BASE_DIR, 'board/static') #추가
STATIC_DIRS=[STATIC_DIR] #추가
...
(3) 1 : 영화 평점 차트 그리기 / 워드클라우드 / CCTV
(3-1) views.py
#영화 평점 차트 그리기
def chart(request):
#title의 value값으로 그룹화(groupby)로 'point'의 평균을 구하고 그 값으로 정렬(역순 정렬) #제일 큰 것부터 10개
data = Movie.objects.values("title").annotate(point_avg=Avg('point')).order_by('-point_avg')[50:60]
df = pd.DataFrame(data)
BigdataPro.makeGraph(df.title, df.point_avg)
return render(request, 'bigdata_pro/chart.html', {'data':data})
#워드 클라우드
def wordcloud(request):
content = Movie.objects.values('content')
df = pd.DataFrame(content)
BigdataPro.makeWordCloud(df.content)
return render(request, 'bigdata_pro/wordcloud.html', {'content':df.content})
#CCTV
def cctv_map(request):
BigdataPro.cctv_map()
return render(request, 'map/map01.html')
(3-2) chart.html
-위치(경로) : teamplates / bigdata_pro / chart.html
{% load static %} #이거 붙여줘야 가져올 수 있음
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 저장한 이미지 바로 불러오겠다. -->
{{data}}<br><br>
<img src="{% static 'images/fig01.png' %}" width=800, height=400>
</body>
</html>
-map01.html : 파일만 만들어 두면 됨.
(3-3) urls.py
urlpatterns = [
path('', views.home),
path('movie_save/', views.movie_save),
path('chart/', views.chart),
path('wordcloud/', views.wordcloud),
path('cctv_map/', views.cctv_map),
...
]
(3-4) 결과 확인
-영화 평점
-cctv_map()
'수업 > └빅데이터' 카테고리의 다른 글
[Django]웹 게시판 만들기(pyweb_board) (0) | 2022.07.05 |
---|
- Total
- Today
- Yesterday
- 미디어 태그
- empty-cell
- selcetor
- html
- html base tag
- improt
- JavaScript
- html input type
- html atrribute
- scanner
- html a tag
- Java
- CascadingStyleSheet
- text formatting
- 외부구성요소
- BAEKJOON
- 입력양식
- ScriptTag
- html layout
- 변수
- css
- A%B
- border-spacing
- initialized
- typeof
- html pre
- caption-side
- input type 종류
- 기본선택자
- 스크립태그
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |