끄적거림

[리뷰 크롤링] AppStore 어플 리뷰 가져오기 2 in python(feat. cURL) 본문

Python/Crawling

[리뷰 크롤링] AppStore 어플 리뷰 가져오기 2 in python(feat. cURL)

Signing 2020. 7. 30. 16:51
728x90
반응형

2020/07/29 - [Python] - [리뷰 크롤링] AppStore 어플 리뷰 가져오기 1(feat. cURL)

 


지난 시간엔 apptweak이라는 사이트에서 제공하는 api를 이용해 앱 리뷰 데이터를 가져오는 작업을 진행했다.

단순 api 호출 성공으로 끝냈었지만, 오늘은 좀 더 내게 맞는 데이터를 이쁘게 가져올 수 있는 작업을 진행하려한다.

 

시작해보자!

 

1. Json to DataFrame

먼저, 이전시간에 test로 뽑아놓은 데이터를 활용하여 어떤 데이터를 어떤 구조로 적재할지를 생각해보고 다시 쿼리를 날릴때(데이터 수집) 어떻게 가져올지를 생각해봐야한다.

내가 한 달 안에 사용 가능한 횟수가 정해져 있기 때문에 신중해야한다.

 

Reading Data

주어진 임시 데이터를 읽어볼 것이다.

rawdata를 살펴보면 json 구조이긴하나 이것이 text 데이터로 보기 힘들게 엮여져 있다.

보기엔 복잡한 json 구조의 txt file

이것을 python의 json 모듈을 사용해서 좀 더 구조화되고 가독성 좋은 포멧으로 바꾸고자 한다.

 

아래의 코드를 입력하면 구조화된 json 데이터를 읽어올 수 있다.

import json

with open("../data/appstore.txt", encoding="utf-8") as f:
    appstore = json.load(f)

json 모듈을 import하고, open과 json.load 함수를 사용해서 파일을 읽어온다.

이때, encoding='utf-8'의 파라미터 조건을 걸어줘야 제대로된 한글을 읽어올 수 있다.

 

읽어오니 이런 모양새다.

AppStore Review json file

그림에서 보이듯 몇 가지 구조를 가지고 있다.

이 구조들은 홈페이지에 자세히 나와있다.

 

그러면 이 json 구조에서 내가 원하는 자료는 어디에 어떤 항목으로 존재할까?

 

지이이이난 시간 PlayStore에서 리뷰를 크롤링했을 때, 내가 선택한 항목들은 다음과 같았다.

  • 리뷰 텍스트 데이터
  • 별점
  • 리뷰 게시 날짜
  • 추천 수(좋아요 수)

이번 AppStore에서도 동일한 항목을 찾을 수가 있었다.

  • content.i.body
  • content.i.rating
  • content.i.date
  • content.i.vote_sum / content.i.vote_count (요 기능이 있는지 apple 인생 8년만에 처음 알았네요... appstore에서 리뷰를 꾹 눌러야 긍정/부정을 투표할 수 있습니다.)
  • content.i.title

AppStore에서는 추가적으로 정보를 얻을 수 있다. 가령, 좋아요와 싫어요라던지, 리뷰 텍스트를 한 줄로 요약한 제목이라던지 하는 것들! PlayStore보다 더 정보가 많은 것 같아 좋은 것 같지만, 사실 vote같은 경우는 사람들이 기능을 잘 몰라서 데이터가 많이 있지 않았다. 그래서 사용하느니 차라리 빼는 방법도 생각해 볼 수 있다.

 

 

일단은 이 데이터들에서 내가 원하는 데이터만 몇 개 추출해서 DataFrame으로 만들고자한다.

 

사실 아래 코드는 지난 play store때에도 사용했던 코드이므로 몇 설명없이 그냥 넘어가겠다.

res_dict = []
for i in range(len(appstore['content'])):
    res_dict.append({
        'DATE' : str(appstore['content'][i]['date']),
        'STAR' : str(appstore['content'][i]['rating']),
        'LIKE' : int(appstore['content'][i]['vote_sum']),
        'DISLIKE' : int(appstore['content'][i]['vote_count']) - int(appstore['content'][i]['vote_sum']),
        'TITLE' : str(appstore['content'][i]['title']),
        'REVIEW' : str(appstore['content'][i]['body'])
    })

코드 수행 결과

2. Convert Data type & format

이 후 데이터 타입이라던지, 포멧 등을 변경하는 작업을 진행해준다.

# Date
res_df['DATE'] = pd.to_datetime(res_df['DATE'], format="%Y-%m-%dT%H:%M:%SZ")

# Star
res_df['STAR'] = res_df['STAR'].apply(lambda x:int(x))

convert data type and format

바꾸었다.

 

 

 

3. Trouble Shooting

근데 이제 문제가 있다.

나는 라이프플러스에 대한 appStore의 사용 리뷰를 더 많이 원하는데 이 방법으로는 이상하게 더 수집이 가능하지가 않는다.

물론, filter review를 이용해서 날짜를 지정하여 이를 반복하여 API를 활용하여 추출하면 된다고 생각했는데, 이상하게 url 뒤에 쿼리부분에서 자꾸 에러가 난다...

 

구글링을 많이 해보았는데도 그에 대한 자료도 몇 없고 대안을 찾기도 힘들었다.

 

그러던 중 새로운 리뷰 데이터 접근법을 발견했다. (구세주 같은 stackoverflow!)

 

이 내용은 다음 포스팅에서 다룰 예정이다!

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments