데이터 크롤링, 스크랩하기 뭐 암튼 데이터 가지고오기.
한 3년전에 처음으로 파이썬 문법이 뭔지도 모를때 동료직원에게 밥사주면서 배웠었다.(실버맨님 감사합니다)
그 후에는 지피티 선생님께 배우다가, 이제는 뭐 찔끌찔끔 가지고오는 정도가 되었다.
처음 실버맨님한테 배웠던게 플레이스토어 정보 가지고 오는거였는데.... (참 힘들게 하나하나 적으면서 배웠는데)
또 이제 세상이 좋아져서 플레이스토어/앱스토어에 대한 정보를 코드 뭐 안짜도 가지고 올 수 있게끔 라이브러리도 나와버렸댜.
(원래도 있었던것같은데 그땐 몰랐고, 한번은 봤을것 같지만 지금은 쓸일이 거의 없으니까 까먹고 있었던건지도 모른다...)
암튼 좀 끄적여보련다.

https://pypi.org/project/google-play-scraper/
google-play-scraper
Google-Play-Scraper provides APIs to easily crawl the Google Play Store for Python without any external dependencies!
pypi.org
https://pypi.org/project/app-store-scraper/
app-store-scraper
Single API ☝ App Store Review Scraper 🧹
pypi.org
감사합니다 이런 라이브러리 페키지 만들어주시고 사랑합니다 전 세계의 천재 똑똑이들님.
나같은 모지리들은 이런것만 있으면 너무 행복하다.
# 구글 플레이스토어 인스톨
pip install google-play-scraper
# 애플 앱스토어 인스톨
pip install app-store-scraper
내가 가지고 오려고하는 앱은 아디다스다.
(추후에 아디다스 관련 분석하는 글을 올릴예정.. MJ파이팅! 나도 파이팅!)
1. 플레이스토어 리뷰 가지고오기
total_reviews = []
count_per_request = 100 # 한 번에 가져올 리뷰 수
target_count = 500 # 목표 리뷰 수500 600부터 호출이 잘안되넹...
result, continuation_token = reviews(
'com.adidas.app', #요기에 가지고오고싶은 어플의 주소와
lang='ko', #한국어
country='kr', # 한국이고
sort=Sort.NEWEST, #최근꺼 순으로
count=count_per_request,
)
total_reviews.extend(result)
while len(total_reviews) < target_count and continuation_token: #이걸로 인해서 100,100,100,100,100 이런식으로 가지고 오려고하는거다.
result, continuation_token = reviews(
'com.adidas.app',
lang='ko',
country='kr',
sort=Sort.NEWEST,
count=count_per_request,
continuation_token=continuation_token
)
total_reviews.extend(result)
# 데이터프레임으로 변환
playstore_reviews_df = pd.DataFrame(total_reviews[:target_count])
위의 코드를 뭐 일일이 설명하기보다는 중요한 부분들은
100개의 갯수 가지고 오고 반복적으로 가지고 오게끔 했고
최근순으로 가지고 오게 했다.

리뷰 결과를 보면 최신순으로 잘 가지고 와졌다!
쓸모없는 부분들이 있는데, 추후에 처리하겠다.
2. 앱스토어 리뷰 가지고 오기
자 플레이스토어 했으니 앱스토어 털어보자.
from app_store_scraper import AppStore
from pprint import pprint
# 아디다스 앱 리뷰 가져오기
adidas_app = AppStore(country="kr", app_name="adidas") #국가와 이름
adidas_app.review(how_many=500) #일단 500개
# 리뷰 데이터를 데이터프레임으로 변환
reviews_list = adidas_app.reviews
appsotre_reviews_df = pd.DataFrame(reviews_list)
훠어어얼씬 깔끔한 만큼 뭔가 최신순이나 어떤 정렬방식은 보이지 않는다.. 깔끔한데 먼가 부족해?

근데 결과에서 보이듯이 500개를 가지고오게 설정을했지만 376개의 리뷰만 나온다..
아마 다가지고 온것으로 판단...
(욕이많넹)
3. 두개의 데이터 프레임 깔끔하게 정리해보기
위 두개의 결과를 보면 뭔가 좀 정리를 해서 합쳐줘야할것같다.
일단 구분하는 컬럼을 만들어주고, 앱스토어인지 플레이스토어인지
앱스토어에는 타이틀과 리뷰가 있는데, 플레이스토어는 리뷰만있다.
그냥 앱스토어의 타이틀 내용과,리뷰를 합치기로 했다. (나중에 텍스트분석할때 그냥 한 컬럼만 쭉 봐도 될것같아서?)
스코어랑 아이디 날짜정도까지만 있어도 충분할것으로 보여진다.
# 플레이스토어 리뷰 데이터프레임 변환
playstore_reviews_df['source'] = 'PlayStore'
playstore_reviews_df['review'] = playstore_reviews_df['content']
playstore_reviews_df['score'] = playstore_reviews_df['score']
playstore_reviews_df['date'] = pd.to_datetime(playstore_reviews_df['at']).dt.date
playstore_review_df = playstore_reviews_df[['userName', 'review', 'score', 'date', 'source']]
# 앱스토어 리뷰 데이터프레임 변환
appsotre_reviews_df['source'] = 'AppStore'
appsotre_reviews_df['review'] = appsotre_reviews_df['title'] + ' ' + appsotre_reviews_df['review']
appsotre_reviews_df['score'] = appsotre_reviews_df['rating']
appsotre_reviews_df['date'] = pd.to_datetime(appsotre_reviews_df['date']).dt.date
appstore_review_df = appsotre_reviews_df[['userName', 'review', 'score', 'date', 'source']]
# 두 데이터프레임 병합
df = pd.concat([playstore_review_df, appstore_review_df], ignore_index=True)

깔끔하게 합쳐졌다.
(분석은 아직 안했지만 앱스토어 2년전 리뷰에 욕이 가득하네..ㅎㅎ)
4. 함수화 시켜보기
사실 위에서 만든 df가 끝이였다. 일단 데이터 모이기가 목적이였으니까.
근데 파이썬 접하다 보면 함수화 시키는걸 좀 많이하게된다.
깔쌈하게 함수화 시킨 코드를 아래 첨부하겠다.
# 플레이스토어 리뷰 가져오기 함수
def fetch_playstore_reviews(app_id, lang, country, target_count=500): #일단 500개만
total_reviews = []
count_per_request = 100 # 요청시 가지고 오는거
result, continuation_token = reviews(
app_id, # 아이디랑
lang=lang, #언어
country=country, #국가
sort=Sort.NEWEST, # 최신순으로
count=count_per_request,
)
total_reviews.extend(result)
while len(total_reviews) < target_count and continuation_token: #반복해서 가지고오는걸로
result, continuation_token = reviews(
app_id,
lang=lang,
country=country,
sort=Sort.NEWEST,
count=count_per_request,
continuation_token=continuation_token
)
total_reviews.extend(result)
playstore_reviews_df = pd.DataFrame(total_reviews[:target_count])
playstore_reviews_df['source'] = 'PlayStore'
playstore_reviews_df['review'] = playstore_reviews_df['content']
playstore_reviews_df['score'] = playstore_reviews_df['score']
playstore_reviews_df['date'] = pd.to_datetime(playstore_reviews_df['at']).dt.date
playstore_reviews_df = playstore_reviews_df[['userName', 'review', 'score', 'date', 'source']]
return playstore_reviews_df
# 앱스토어 리뷰 가져오기 함수
def fetch_appstore_reviews(app_name, country, target_count=500):
app = AppStore(country=country, app_name=app_name)
app.review(how_many=target_count)
appstore_reviews_df = pd.DataFrame(app.reviews)
appstore_reviews_df['source'] = 'AppStore'
appstore_reviews_df['review'] = appstore_reviews_df['title'] + ' ' + appstore_reviews_df['review']
appstore_reviews_df['score'] = appstore_reviews_df['rating']
appstore_reviews_df['date'] = pd.to_datetime(appstore_reviews_df['date']).dt.date
appstore_reviews_df = appstore_reviews_df[['userName', 'review', 'score', 'date', 'source']]
return appstore_reviews_df
# 리뷰 데이터 수집
playstore_reviews_df = fetch_playstore_reviews('com.adidas.app', 'ko', 'kr', target_count=500)
appstore_reviews_df = fetch_appstore_reviews('adidas', 'kr', target_count=500)
# 두 데이터프레임 병합
merged_reviews_df = pd.concat([playstore_reviews_df, appstore_reviews_df], ignore_index=True)
# 데이터 저장
merged_reviews_df.to_csv('merged_reviews.csv', index=False, encoding='utf-8-sig')
아름다워 아름다워.....
잘 활용하면 앱 스토어/플레이스토어에 대한 데이터를 편하게 얻을 수있고 분석도 할 수 있겠다.
'Data Analysis > 코드 끄적이기' 카테고리의 다른 글
| [끄적이기 6] Python으로 나만의 포트폴리오 백테스팅 시스템 구축하기: yfinance (3) | 2025.01.01 |
|---|---|
| [끄적이기 5] Kaggle: Apple Stock Data and Key Affiliated Companies 애플 주식 데이터 분석 (9) | 2024.10.12 |
| [끄적이기4] ChatGPT API 활용해서 감성분석해보기 (3) | 2024.10.05 |
| [끄적이기3] Kaggle: Movies 1910-2024 (Metacritic) 매타크리틱 영화 데이터 (9) | 2024.09.28 |
| [끄적이기2] Selenium THRID_PARTY_NOTICES.chromedriver Error 해결하기 (0) | 2024.07.27 |
