본문 바로가기

programming/Gukbi

국비 교육 100일차 - python 크롤링 및 개인프로젝트 시작

728x90
반응형

python으로는 웹 크롤링이 좀 더 쉽다고 들었는데, 수업에서 직접해보니 자바에서 할때보다 코드 수도 훨씩 적고 쉬웠다.

python에서 파싱을 하기 위해서는 request, beautifulSoup을 다운받아야 한다. 

 

 

일단 간단하게 먼저 xml 파싱을 해봤다. 

#-*- coding:utf-8 -*-
import urllib.request as req
from bs4 import BeautifulSoup
from urllib import parse

fd=input("검색어 입력:")
fd=parse.quote(fd) #인코딩
print(fd)

url=f"http://newssearch.naver.com/search.naver?where=rss&query={fd}"
res=req.urlopen(url)
soup=BeautifulSoup(res,'html.parser')
#print(soup)
data=soup.find_all("item")
for item in data:
    #print(item)
    title=item.find("title").string
    #print(title)
    desc=item.find("description").string
    author=item.find("author").string
    #pubDate=item.find("pubDate").string
    link=item.find("link").string
    category=item.find("category").string
    print(title)
    print(desc)
    #print(pubDate)
    print(link)
    print(category)
    print("===================")

 태그를 읽어서 그 안의 내용들을 각각의 변수에 담아준다. find메소드와 .string을 이용하면 찾아올 수 있다. 

엔시티 드림으로 검색한 결과 

selnum=int(input("1.박스오피스, 2.실시간 예매율, 3.좌석 점유율, 4.온라인 상영관:"))
url='' 
if selnum==1:
    print("박스오피스")
    url="https://www.kobis.or.kr/kobis/business/main/searchMainDailyBoxOffice.do"
elif selnum==2:
    print("실시간 예매율")
    url="https://www.kobis.or.kr/kobis/business/main/searchMainRealTicket.do"
elif selnum==3:
    print("좌석 점유율")
    url="https://www.kobis.or.kr/kobis/business/main/searchMainDailySeatTicket.do"
elif selnum==4:
    print("온라인 상영관")
    url="https://www.kobis.or.kr/kobis/business/main/searchMainOnlineDailyBoxOffice.do"
    
    
#url="https://www.kobis.or.kr/kobis/business/main/searchMainDailyBoxOffice.do"
web_data=req.urlopen(url).read().decode('utf-8')
#print(web_data)
json_data=json.loads(web_data)
#print(json_data)

for movie in json_data:
    print("영화명:"+movie['movieNm'])
    print("감독:"+movie['director'])
    print("장르:"+movie['genre'])
    print("등급:"+movie['watchGradeNm'])
    print("상영시간:"+movie['showTm']) 
    print("==================")

 json 파싱

 

url을 다르게 해서 내용을 긁어오고 있다. json은 태그가 아닌 key를 주고 value를 읽어오는 방식을 사용하고 있다. 

 

import urllib.request as req
from bs4 import BeautifulSoup
import requests
'''
<td class="title">
                        <div class="tit3">
                            <a href="/movie/bi/mi/basic.nhn?code=189150" title="분노의 질주: 더 얼티메이트">분노의 질주: 더 얼티메이트</a>
                        </div>
                    </td>
'''
url="https://movie.naver.com/movie/sdb/rank/rmovie.nhn"
movie_data=requests.get(url)
movie_data=movie_data.text
#print(movie_data)
soup=BeautifulSoup(movie_data,'html.parser')
mList=soup.select(".title > .tit3 > a")
for movie_title in mList:
    print(movie_title.attrs['href'])
    print(movie_title.text)

html 파싱

역시 어렵지 않게 태그를 사용해서 값을 읽어오고 있다. 

 

import urllib.request as req
from bs4 import BeautifulSoup
import json

class MovieSystem:
    def movie_list(self):
        #웹서버 연결
        page=int(input("페이지 입력:"))
        url=f"http://192.168.0.7/web/movie/list.do?page={page}"
        web_data=req.urlopen(url).read().decode('utf-8')
        
        print(web_data)
        
        json_data=json.loads(web_data)
        print(json_data)
        
        for movie in json_data:
            print("========================")
            print("영화제목:"+movie['title'])
            print("상영일:"+movie['regdate'])
            print("장르:"+movie['genre'])
            print("등급:"+movie['grade'])
            print("제작:"+movie['nation'])
            print("상영시간:"+movie['time'])
            print("순위:"+str(movie['mno']))
     
    def movie_detail(self,mno):
        url="http://192.168.0.7/web/movie/detail.do?mno="+str(mno) 
        web_data=req.urlopen(url).read().decode('utf-8')
        print(web_data)
        movie=json.loads(web_data)
        print(movie)   
        print("========================")
        print("영화제목:"+movie['title'])
        print("상영일:"+movie['regdate'])
        print("장르:"+movie['genre'])
        print("등급:"+movie['grade'])
        print("제작:"+movie['nation'])
        print("상영시간:"+movie['time'])
        print("순위:"+str(movie['mno']))
        print("박스오피스:"+movie['boxoffice'])
        print("누적관객:"+movie['showUser'])
        print("평점:"+str(movie['score']))
        print("줄거리:"+movie['story'])
        
        
    
    
#mno=int(input("상세볼 영화 번호:"))
#movie_detail(mno)

movie=MovieSystem()
mno=int(input("상세볼 영화 번호:"))
movie.movie_detail(mno)

json 파싱 함수를 클래스로 묶어서 메소드화 시켰다. 페이지별로, 영화넘버별로 상세정보까지 볼 수 있게 만들었다. 

 

 

그리고 개인프로젝트는 다음주부터 장고를 활용해서 진행하게 됐다. 주제는 이미 정했고, 데이터 수집까지 마쳐놨다. 이제까지 계속 협업으로 팀 프로젝트만 하다가 처음으로 개인 프로젝트를 하게되어 떨리면서 기대가 된다. 

 

 

728x90
반응형