[실습] 파이썬 크롤링으로 안드로이드앱 실시간 순위구하기

Posted by Pando on August 9, 2020

파이썬 크롤링으로 안드로이드앱 실시간 순위구하기

구글에 안드로이드 앱 순위를 검색해보니, 다음과 같은 사이트가 나온다.


android rank list site

인기순위를 보기 위해서 우측상단에 더보기 를 눌러야 볼 수 있다.


android rank detail site

그러나 화면 안에 순위를 명시한 값이 보이지않아 맨 먼저 값에 순위를 매겨야겠다.

프로그래밍적으로 사고하기

내가 생각하는 순서는 다음과 같다.

  1. 필요한 Library Import (requests, BeautifulSoup)
  2. 안드로이드 순위 URL을 requests로 정보 가져오기
  3. BeautifulSoup으로 가져온 정보 html parsing
    1. 앱순위를 모아둔 가장 큰 영역 태그 가져오기
    2. 앱 하나하나 이루어진 태그들 추출하기
    3. 제목 태그 꺼내오기
  4. 맨 처음 가져오는 순서를 1부터 부여해 랭크 출력

코드

1. 필요한 라이브러리를 import

1
2
3
# 1. 필요한 라이브러리를 import
import requests
from bs4 import BeautifulSoup

2. requests로 해당 사이트 가져오기

1
2
3
# 2. requests로 해당 사이트 가져오기
android_rank_url = "https://play.google.com/store/apps/collection/cluster?clp=0g4jCiEKG3RvcHNlbGxpbmdfZnJlZV9BUFBMSUNBVElPThAHGAM%3D:S:ANO1ljKs-KA&gsr=CibSDiMKIQobdG9wc2VsbGluZ19mcmVlX0FQUExJQ0FUSU9OEAcYAw%3D%3D:S:ANO1ljL40zU&hl=ko"
response = requests.get(android_rank_url)

3. BeautifulSoup으로 html parsing

1
2
# 3. BeautifulSoup으로 html parsing
soup = BeautifulSoup(response.text, 'html.parser')

4~5. 필요한 데이터 가져오기

  • 4-1. (1)번 영역 가져오기
  • 4-2. (2)번 영역 가져오기
  • 4-3. (3)번 영역 가져오기
  • 5. 순서가 없기때문에 enumerate로 rank 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 4-1. (1)번 영역 가져오기
all_app_tag = soup.select_one("div.ZmHEEd")

# 4.2. (2)번 영역 가져오기
all_app_tag_list = all_app_tag.select("div.ImZGtf.mpg5gc")

for index, app_tag in enumerate(all_app_tag_list):
    # 4.3. (3)번 영역 가져오기
    app_title_tag = app_tag.select_one(
        "c-wiz > div > div > div.RZEgze > div > div > div.bQVA0c > div > div > div.b8cIId.ReQCgd.Q9MA7b > a > div"
    )

    # 5. 순서가 없기때문에 enumerate로 rank 생성
    rank = index + 1
    print(rank, app_title_tag.text)

예외사항

코드를 확인해보니 한국순위가 아니라 아무래도 화면과 다른 국가의 순위의 앱이 나오고 있었다. (20.08.09에 한국 1위는 T연락처 였는데, 크롤링 1위 순위는 ZOOM 이었다)

무언가 국가코드가 존재할 것 같아 stackoverflow에 검색을 해봤다.

URL querystring에 &gl=kr를 추가하면 된다!

완성코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1. 필요한 라이브러리를 import
import requests
from bs4 import BeautifulSoup

# 2. requests로 해당 사이트 가져오기
android_rank_url = "https://play.google.com/store/apps/collection/cluster?clp=0g4jCiEKG3RvcHNlbGxpbmdfZnJlZV9BUFBMSUNBVElPThAHGAM%3D:S:ANO1ljKs-KA&gsr=CibSDiMKIQobdG9wc2VsbGluZ19mcmVlX0FQUExJQ0FUSU9OEAcYAw%3D%3D:S:ANO1ljL40zU&hl=ko&gl=kr"
response = requests.get(android_rank_url)

# 3. BeautifulSoup으로 html parsing
soup = BeautifulSoup(response.text, 'html.parser')

# 4-1. (1)번 영역 가져오기
all_app_tag = soup.select_one("div.ZmHEEd")

# 4.2. (2)번 영역 가져오기
all_app_tag_list = all_app_tag.select("div.ImZGtf.mpg5gc")

for index, app_tag in enumerate(all_app_tag_list):
    # 4.3. (3)번 영역 가져오기
    app_title_tag = app_tag.select_one(
        "c-wiz > div > div > div.RZEgze > div > div > div.bQVA0c > div > div > div.b8cIId.ReQCgd.Q9MA7b > a > div"
    )

    # 5. 순서가 없기때문에 enumerate로 rank 생성
    rank = index + 1
    print(rank, app_title_tag.text)