api(json)을 통한 feature 크롤링

y : 'owner_action' key안에 있는 ['rating': 내가준 별점]

X : ['title':영화제목, 'eval_count':평가자수, 'watcha_rating':평균별점, 'filmrate':관람가, 'main_genre':장르, 'nation':국가, 'running_time':상영시간, 'year':제작년도]

$\hat y$ : predicted_rating

추가로 뽑아야 할 feature들

X : [감독, 주연배우, 이동진영화평론가의 평점]



In [1]:
import requests
import json
import pandas as pd

Watcha api url page=1 ~ 23 까지의 크롤링 작업


In [2]:
df = pd.DataFrame(columns = ['영화', '내 별점(y)', '평균별점', '평가자수', '등급', '장르', '국가', '상영시간', '년도'])

for page_num in range(1, 23):
    response = requests.get("https://watcha.net/v2/users/jXaIHl0ZtdYZ/movies.json?filter%5Bsorting%5D=time&page={page}".format(
        page=page_num))
    watcha_dict = json.loads(response.text)
    watcha_list = watcha_dict.get('cards')
    
    for i in range(24):
        rating = watcha_list[i].get('items')[0].get('item').get('owner_action').get('rating') # y값 : 나의 rating
        
        title = watcha_list[i].get('items')[0].get('item').get('title')
        avg_rating = watcha_list[i].get('items')[0].get('item').get('watcha_rating')
        eval_count = watcha_list[i].get('items')[0].get('item').get('eval_count')
        film_rate = watcha_list[i].get('items')[0].get('item').get('filmrate')
        genre = watcha_list[i].get('items')[0].get('item').get('main_genre')
        nation = watcha_list[i].get('items')[0].get('item').get('nation')
        running_time = watcha_list[i].get('items')[0].get('item').get('running_time')
        year = watcha_list[i].get('items')[0].get('item').get('year')
        
        df.loc[len(df)] = [title, rating, avg_rating, eval_count, film_rate, genre, nation, running_time, year]

In [3]:
df


Out[3]:
영화 내 별점(y) 평균별점 평가자수 등급 장르 국가 상영시간 년도
0 스포트라이트 3.5 4.22683 9690 15세 관람가 드라마 미국 128 2015
1 찌라시 : 위험한 소문 2.5 2.99629 57498 15세 관람가 드라마 한국 121 2013
2 비포 미드나잇 4.0 3.90119 65978 청소년 관람불가 로맨스/멜로 미국 108 2013
3 더 웹툰: 예고살인 2.0 2.62241 66523 15세 관람가 공포 한국 104 2013
4 트랜센던스 3.0 3.31175 67645 12세 관람가 SF 미국, 영국 119 2014
5 인간중독 2.0 2.27068 70810 청소년 관람불가 드라마 한국 132 2014
6 헝거게임: 모킹제이 2.5 3.52048 73472 15세 관람가 판타지 미국 123 2014
7 인턴 3.5 3.90317 73660 12세 관람가 코미디 미국 121 2015
8 뷰티 인사이드 2.0 3.61165 76463 12세 관람가 로맨스/멜로 한국 127 2015
9 검은 사제들 4.0 3.60711 78477 15세 관람가 스릴러 한국 108 2015
10 내부자들 4.5 3.86041 80183 청소년 관람불가 범죄 한국 130 2015
11 사일런트 힐 3.0 3.34497 83144 청소년 관람불가 공포 캐나다, 일본, 미국, 프랑스 124 2006
12 마션 3.5 4.01025 92499 12세 관람가 SF 미국 142 2015
13 시간 여행자의 아내 3.0 3.66282 96531 12세 관람가 로맨스/멜로 미국 107 2009
14 군도:민란의 시대 3.5 3.14855 100696 15세 관람가 액션 한국 137 2014
15 씬 시티 3.5 3.56793 101571 청소년 관람불가 범죄 미국 123 2005
16 끝까지 간다 4.0 3.86662 115156 15세 관람가 범죄 한국 111 2013
17 빅 히어로 4.0 3.95044 117918 전체 관람가 애니메이션 미국 108 2014
18 루시 3.0 3.10815 121206 청소년 관람불가 액션 미국, 프랑스 90 2014
19 버킷 리스트 - 죽기 전에 꼭 하고 싶은 것들 3.5 3.94196 126803 12세 관람가 드라마 미국 96 2007
20 킬러들의 수다 3.5 3.36549 132204 15세 관람가 코미디 한국 120 2001
21 암살 4.0 3.94286 139114 15세 관람가 액션 한국 140 2015
22 베테랑 3.5 4.00765 151806 15세 관람가 액션 한국 124 2015
23 메이즈 러너 2.5 3.69728 157375 12세 관람가 액션 미국 113 2014
24 디 워 0.5 1.98421 266510 12세 관람가 판타지 한국 90 2007
25 건축학개론 3.0 3.58254 634208 12세 관람가 로맨스/멜로 한국 118 2012
26 어거스트 러쉬 3.5 3.94234 448046 전체 관람가 드라마 미국 113 2007
27 브루스 올마이티 3.5 3.79117 313198 12세 관람가 코미디 미국 100 2003
28 색, 계 4.0 3.55195 177695 청소년 관람불가 로맨스/멜로 미국, 중국, 대만, 홍콩 157 2007
29 펄프 픽션 3.5 3.93998 65074 청소년 관람불가 범죄 미국 154 1994
... ... ... ... ... ... ... ... ... ...
498 실미도 4.0 3.69916 434176 15세 관람가 액션 한국 135 2003
499 태극기 휘날리며 4.0 3.88916 557510 15세 관람가 전쟁 한국 145 2003
500 아저씨 4.0 3.95571 667011 청소년 관람불가 액션 한국 119 2010
501 다크 나이트 라이즈 5.0 4.18383 491726 15세 관람가 판타지 미국, 영국 164 2012
502 웰컴 투 동막골 5.0 3.66893 517025 12세 관람가 코미디 한국 133 2005
503 늑대소년 4.0 3.45183 543966 15세 관람가 로맨스/멜로 한국 125 2012
504 좋은 놈, 나쁜 놈, 이상한 놈 3.0 3.46538 451928 15세 관람가 액션 한국 139 2008
505 어벤져스 3.0 4.05681 604999 12세 관람가 판타지 미국 142 2012
506 베를린 2.0 3.48324 397766 15세 관람가 액션 한국 120 2012
507 써니 2.0 3.95354 731014 15세 관람가 코미디 한국 124 2011
508 트랜스포머: 패자의 역습 3.0 3.68044 433493 12세 관람가 SF 미국 149 2009
509 국가대표 4.0 3.75914 596731 12세 관람가 코미디 한국 137 2009
510 해운대 2.0 3.29134 602607 12세 관람가 드라마 한국 120 2009
511 괴물 4.0 3.82494 676592 15세 관람가 스릴러 한국 119 2006
512 과속스캔들 4.0 3.73748 654809 12세 관람가 코미디 한국 108 2008
513 왕의 남자 5.0 3.74804 573251 15세 관람가 드라마 한국 119 2005
514 광해, 왕이 된 남자 4.0 4.02419 735934 15세 관람가 드라마 한국 131 2012
515 7번방의 선물 4.0 3.97763 714035 15세 관람가 코미디 한국 127 2012
516 도둑들 4.0 3.76309 706883 15세 관람가 액션 한국 135 2012
517 말죽거리 잔혹사 3.0 3.37415 283805 15세 관람가 액션 한국 116 2004
518 포화 속으로 3.0 3.30031 294024 12세 관람가 전쟁 한국 120 2010
519 스파이더맨 2 3.0 3.67278 330798 12세 관람가 판타지 미국 126 2004
520 센과 치히로의 행방불명 5.0 4.27281 643688 전체 관람가 애니메이션 일본 126 2001
521 나비 효과 5.0 4.04594 297595 청소년 관람불가 스릴러 미국 113 2004
522 셔터 아일랜드 4.0 3.80457 219216 15세 관람가 스릴러 미국 138 2010
523 트루먼 쇼 5.0 4.22021 426398 15세 관람가 드라마 미국 102 1998
524 이프 온리 3.0 4.03853 364964 15세 관람가 로맨스/멜로 미국, 영국 96 2004
525 공동경비구역 JSA 5.0 3.89998 320751 15세 관람가 드라마 한국 110 2000
526 본 슈프리머시 4.0 4.14620 232427 15세 관람가 액션 미국, 독일 110 2004
527 초능력자 2.0 2.85195 271477 15세 관람가 스릴러 한국 114 2010

528 rows × 9 columns

api url page=24 크롤링 작업


In [4]:
df1 = pd.DataFrame(columns = ['영화', '내 별점(y)', '평균별점', '평가자수', '등급', '장르', '국가', '상영시간', '년도'])

response = requests.get("https://watcha.net/v2/users/jXaIHl0ZtdYZ/movies.json?filter%5Bsorting%5D=time&page=23")
watcha_dict = json.loads(response.text)
watcha_list = watcha_dict.get('cards')

len(watcha_list)

for i in range(16):
        rating = watcha_list[i].get('items')[0].get('item').get('owner_action').get('rating') # y값 : 나의 rating
        
        title = watcha_list[i].get('items')[0].get('item').get('title')
        avg_rating = watcha_list[i].get('items')[0].get('item').get('watcha_rating')
        eval_count = watcha_list[i].get('items')[0].get('item').get('eval_count')
        film_rate = watcha_list[i].get('items')[0].get('item').get('filmrate')
        genre = watcha_list[i].get('items')[0].get('item').get('main_genre')
        nation = watcha_list[i].get('items')[0].get('item').get('nation')
        running_time = watcha_list[i].get('items')[0].get('item').get('running_time')
        year = watcha_list[i].get('items')[0].get('item').get('year')
        
        df1.loc[len(df1)] = [title, rating, avg_rating, eval_count, film_rate, genre, nation, running_time, year]

In [5]:
df1


Out[5]:
영화 내 별점(y) 평균별점 평가자수 등급 장르 국가 상영시간 년도
0 블라인드 2 3.40819 283607 청소년 관람불가 스릴러 한국 111 2011
1 스쿨 오브 락 3 3.79351 296312 전체 관람가 코미디 미국, 독일 108 2003
2 500일의 썸머 5 3.87432 289315 15세 관람가 로맨틱 코미디 미국 95 2009
3 쇼생크 탈출 4 4.42741 456964 15세 관람가 드라마 미국 142 1994
4 러브 레터 5 3.97103 225600 전체 관람가 로맨스/멜로 일본 117 1995
5 범죄와의 전쟁 : 나쁜놈들 전성시대 4 3.99282 463375 청소년 관람불가 범죄 한국 133 2011
6 악마는 프라다를 입는다 4 3.83566 483744 12세 관람가 로맨틱 코미디 미국 109 2006
7 이끼 3 3.28881 273316 청소년 관람불가 스릴러 한국 163 2010
8 리얼 스틸 1 3.69244 314848 12세 관람가 SF 미국 127 2011
9 레옹 4 4.29233 383225 청소년 관람불가 범죄 프랑스, 미국 133 1994
10 내가 살인범이다 2 3.53845 308430 청소년 관람불가 스릴러 한국 119 2012
11 말아톤 4 3.60102 373017 전체 관람가 드라마 한국 115 2005
12 클래식 5 3.85321 313581 12세 관람가 로맨스/멜로 한국 132 2003
13 아이언맨 3 4 4.10486 562034 12세 관람가 SF 미국, 중국 129 2013
14 어린 신부 3 2.97457 340666 12세 관람가 로맨틱 코미디 한국 115 2004
15 내 아내의 모든 것 4 3.65453 460534 15세 관람가 로맨틱 코미디 한국 121 2012

최종DataFrame (sample : 544개)

  • append

In [6]:
watcha_df = df.append(df1, ignore_index=True)
watcha_df.tail(10)


Out[6]:
영화 내 별점(y) 평균별점 평가자수 등급 장르 국가 상영시간 년도
534 악마는 프라다를 입는다 4 3.83566 483744 12세 관람가 로맨틱 코미디 미국 109 2006
535 이끼 3 3.28881 273316 청소년 관람불가 스릴러 한국 163 2010
536 리얼 스틸 1 3.69244 314848 12세 관람가 SF 미국 127 2011
537 레옹 4 4.29233 383225 청소년 관람불가 범죄 프랑스, 미국 133 1994
538 내가 살인범이다 2 3.53845 308430 청소년 관람불가 스릴러 한국 119 2012
539 말아톤 4 3.60102 373017 전체 관람가 드라마 한국 115 2005
540 클래식 5 3.85321 313581 12세 관람가 로맨스/멜로 한국 132 2003
541 아이언맨 3 4 4.10486 562034 12세 관람가 SF 미국, 중국 129 2013
542 어린 신부 3 2.97457 340666 12세 관람가 로맨틱 코미디 한국 115 2004
543 내 아내의 모든 것 4 3.65453 460534 15세 관람가 로맨틱 코미디 한국 121 2012

In [18]:
path='C:/Users/JKEUN/ipython notebook/project_01_watcha/resource/'
watcha_df.to_csv(path+'1st_df.csv', index=False, encoding='utf8')

In [ ]: