파이썬 크롤링으로 안드로이드앱 실시간 순위구하기
구글에 안드로이드 앱 순위를 검색해보니, 다음과 같은 사이트가 나온다.
인기순위를 보기 위해서 우측상단에 더보기 를 눌러야 볼 수 있다.
그러나 화면 안에 순위를 명시한 값이 보이지않아 맨 먼저 값에 순위를 매겨야겠다.
프로그래밍적으로 사고하기
내가 생각하는 순서는 다음과 같다.
- 필요한 Library Import (requests, BeautifulSoup)
- 안드로이드 순위 URL을 requests로 정보 가져오기
- BeautifulSoup으로 가져온 정보 html parsing
-
- 앱순위를 모아둔 가장 큰 영역 태그 가져오기
- 앱 하나하나 이루어진 태그들 추출하기
- 제목 태그 꺼내오기
- 맨 처음 가져오는 순서를 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)