본문 바로가기
Dev/Python

[Python Crawling] Python으로 App Store 리뷰 크롤링하기

by 데브길길잇 2022. 9. 5.
728x90
반응형

안녕하세요 dev-길길IT입니다.

 

크롤링(Crawling)은 웹사이트(website), 하이퍼링크(hyperlink), 데이터(data)등의

웹 기반 정보 자원을 자동화된 방법으로 수집, 분류, 저장하는 것을 의미합니다.

크롤링을 위해 개발된 소프트웨어 프로그램은 크롤러(crawler)라고 하죠. 

 

회사에서 IOS App에 달린 리뷰를 DB에 저장하는 크롤링 프로그램 개발 요청을 받았습니다.

최근에 크롤링에 관심이 많아서 이것 저것 해보고 있는데

Google Play Store는 다수 해본 경험이 있으나 App Store 쪽은 경험이 없어서

이번 기회에 진행해보며 포스팅을 하게 되었습니다.

 

Python으로 App Store 리뷰 크롤링하기

 

※목차
1. App Store에서 리뷰를 보는 URL 링크 확인
2. Scroll Down 이벤트를 통한 전체 리뷰 조회
3. 필요한 Data Parsing

 

1. App Store에서 리뷰를 보는 URL 링크 확인

요즘 쿠키런 킹덤 게임이 인기가 많아서 쿠키런 킹덤의 App Store 댓글을 크롤링하는 코드를 작성해보려 합니다.

우선 App Store에 접속해서 해당 App을 조회해봅니다.

 

그러면 하단에 평가 및 리뷰 쪽에 모두 보기라는 버튼이 생성됩니다.

클릭하여 이동합니다.

 

이동된 화면에서는 App Store에 등록된 전체 리뷰를 보는 것이 가능하며

위에 #see-all/reviews라는 URL이 생성됩니다.

 

* 여기서 위 페이지를 분석해보면 2가지 이슈가 있습니다.

 

1. 리뷰가 최신 순으로 정렬되지 않는다.

2. 스크롤을 내릴 때마다 이전 댓글이 나온다.

(전체 데이터를 조회할 수가 없음)

2가지 이슈에 대한 해결방법은

스크롤을 수십번 반복해서 화면 전체에 모든 리뷰가 출력되도록 합니다.

그 후 화면에 출력된 리뷰 전체를 크롤링하기로 했습니다.


2. Scroll Down 이벤트를 통한 전체 리뷰 조회

파이썬 크롤링을 위해서는 몇가지 준비사항이 있는데 자세한 사항은 다음에 다시 포스팅하겠습니다.

간단하게 3가지가 필요합니다.

1) 파이썬 selenium library

2) 파이썬 BeautifulSoup library

3) 버전에 맞는 chrome driver

위 3가지를 설치하면 됩니다.

 

코드는 다음과 같습니다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

AppList = {
    'I001': 'https://apps.apple.com/kr/app/%EC%BF%A0%ED%82%A4%EB%9F%B0-%ED%82%B9%EB%8D%A4/id1509450845#see-all/reviews',
}

driver = webdriver.Chrome('C:\python_util\chromedriver.exe')
for urlCd,url in AppList.items():
    driver.implicitly_wait(1)
    driver.maximize_window()
    driver.get(url)
    driver.implicitly_wait(10)  # re-routing 될 수 있는 시간을 확보
    body = driver.find_element_by_css_selector('body')

    num_of_pagedowns = 50
    while num_of_pagedowns:
        body.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.5)
        num_of_pagedowns -= 1

AppList 안에 크롤링의 대상이 되는 URL을 정의해주고 webdriver를 통해 chrome driver를 load합니다.

 

파이썬의 selenium library안에는 Keys 라는 모듈이 있습니다.

keys에는 PAGE_DOWN이라는 함수가 정의되어 있으며 마치 화면이 스크롤 되게끔 해주는 역할을 합니다.

스크롤을 몇 번 내릴 것인지 num_of_pagedowns를 정해야 하는데 우선 50번으로 정하고 테스트를 진행해보겠습니다.

이렇게 스크롤이 아래로 쭉쭉 내려갑니다.

전체 댓글이 많을수록 횟수를 늘려주면 됩니다.


3. 필요한 Data Parsing

 

필요한 Data를 

1. ID

2. 날짜

3. 소제목

4. 본문

 

이라고 가정을 하고 파이썬 크롤링을 진행하겠습니다.

 

크롤링은 HTML, CSS 태그를 기반으로 Data Parsing을 진행합니다.

크롬의 경우 F12 개발자 도구를 통해 해당 영역의 태그를 추출할 수 있습니다.

 

total_review_cnt = len(soup.findAll('div', {'role':'article'}))

    for i in range(0, total_review_cnt):
        if len(soup.findAll('div', {'role':'article'})[i].findAll('blockquote')) >= 2:
            pass
        else :
            review_val = soup.find_all("div", {"role": "article"})[i]
            customer_nm = review_val.find('span', {'class':'we-truncate we-truncate--single-line ember-view we-customer-review__user'}).string.strip()
            date = review_val.find('time').string.strip().split()
            year = date[0].replace('년','')
            month = date[1].replace('월','')
            if len(month) == 2:
                pass
            elif len(month) == 1:
                month = '0' + month
            day = date[2].replace('일','')
            if len(day) == 2:
                pass
            elif len(day) == 1:
                month = '0' + month
            register_dt = year+month+day
            title = review_val.find('h3', {'class':'we-truncate we-truncate--single-line ember-view we-customer-review__title'}).string.strip()
            msg = review_val. findAll('p', {'dir':'ltr'})[0].string.strip()
            reg_contents = title + '_' + msg
            print(customer_nm + ' ' + register_dt + ' ' + reg_contents)

div, h3, p 각각의 클래스와 규칙들을 이용해서 위와 같이 데이터를 가져오도록 정의해줍니다.

 

실제로 코드를 실행해보면 그러면 화면에 위와 같이 출력됩니다.

이 정보는 엑셀로 가공하거나 DB화하여 사용하시면 됩니다.

 

 

 


 

 

마무리

오늘은Python으로 App Store 리뷰 크롤링하기에 대해 포스팅해보았습니다.

데이터를 긁어오는 것은 꼭 개발 전공이 아니어도 누구나 시도해보실 수 있는 쉬운 기술이지만

단순히 데이터를 긁어오는 행위뿐만 아니라

여러가지 웹 스크립트를 제어하는 기능을 총 망라하는 것이 크롤링이기 때문에

깊게 공부해보시면 놀라운 경험을 하실 수 있을 것입니다.

 

오늘도 읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글