티스토리 뷰

 

파이썬으로 각종 빅데이터 크롤링/분석/시각화 결과를

쟝고(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
링크
«   2025/07   »
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
글 보관함