당신은 주제를 찾고 있습니까 “앱 크롤링 – 데이터수집? 크롤링 하는 방법 알려드릴게요! | 프로그래밍 팁“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 정빈의 개발채널 이(가) 작성한 기사에는 조회수 1,885회 및 좋아요 25개 개의 좋아요가 있습니다.
앱 크롤링 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 데이터수집? 크롤링 하는 방법 알려드릴게요! | 프로그래밍 팁 – 앱 크롤링 주제에 대한 세부정보를 참조하세요
안녕하세요. 백엔드 개발자 \”하나셋\”입니다.
데이터 크롤링에 대한 제가 아는 내용들을 한번 영상으로 만들어보았습니다.
웹, 앱에서 사용되는 API 찾는 법과 HTML 파싱입니다.
#API #크롤링 #파싱
앱 크롤링 주제에 대한 자세한 내용은 여기를 참조하세요.
Android) 안드로이드 Jsoup로 웹크롤링 하기 (예제포함)
Andro) 안드로이드 Jsoup로 웹크롤링 하기 (예제포함) – “데일리 브리핑 앱 개발기”. h__glacier_ 2021. 8. 12. 03:00.
Source: h-glacier.tistory.com
Date Published: 7/12/2022
View: 3476
앱 크롤링 (스크래핑) 가능한가요? – 지식iN – 네이버
앱 크롤링 (스크래핑) 가능한가요? 안녕하세요, 미세먼지에 관심이 있는 대학원생입니다. 현재 kt에서 “airmapkorea”라는 앱을 통해 전국 …
Source: kin.naver.com
Date Published: 2/8/2021
View: 713
웹이 아닌 어플 내용을 크롤링 할 수 있나요? – OKKY
네이티브앱에서 타 앱 데이터에 간섭하고 싶단 얘긴가요? 0. reniew. 10. 2018-10-27 17:18:25. 아뇨 꼭 앱이아니라 그냥 웹 데이터를 크롤링 하듯이 …
Source: okky.kr
Date Published: 8/29/2022
View: 8784
‘웹 크롤러’ 좀 그만 만들어라 – velog
인터넷에 ‘크롤러 만들기’를 쳤다하면 90% 확률로 파이썬으로 크롤러는 만드는 방법에 대해 잘 쓰여진 블로그가 수십개씩 검색 결과로 우수수 떨어지고 그 …
Source: velog.io
Date Published: 5/19/2021
View: 751
[Python] 구글 플레이 스토어 크롤러 코드 Version 2.0.2
주요 기능. 1) 구글 플레이 스토어 App 사용자 리뷰 자동 수집(그림 1). 리뷰 등록일; 작성자 닉네임; 리뷰 평점; 리뷰 내용.
Source: heytech.tistory.com
Date Published: 7/19/2021
View: 6242
[파이썬Python-웹 스크래핑] 구글 플레이 스토어 앱 리뷰 크롤링
관심 있는 앱의 리뷰 데이터를 수집하는 크롤러를 만들어봤습니다. 이 페이지에서 개발자가 단 답글은 제외하고 사용자의 리뷰와 별점만 수집.
Source: mokeya.tistory.com
Date Published: 7/9/2021
View: 3678
[리뷰 크롤링] AppStore 어플 리뷰 가져오기 1(feat. cURL)
그렇다면 본격적으로 IOS의 앱 리뷰 데이터를 가져와보도록 하자! 1. Install and Setting cURL. Install. 해당 사이트에서는 api를 cURL를 활용하여 기능 …
Source: signing.tistory.com
Date Published: 3/1/2022
View: 7121
002 웹 크롤링 웹 앱 서비스 만들기 – 핵심만 해보는 flask 튜토리얼
002 웹 크롤링 웹 앱 서비스 만들기. 파이썬 웹 크롤링을 이용하여, 수집한 내용을 웹으로 표현해봅시다. 마지막 편집일시 : 2020년 6월 22일 10:41 …
Source: wikidocs.net
Date Published: 6/6/2021
View: 8608
주제와 관련된 이미지 앱 크롤링
주제와 관련된 더 많은 사진을 참조하십시오 데이터수집? 크롤링 하는 방법 알려드릴게요! | 프로그래밍 팁. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 앱 크롤링
- Author: 정빈의 개발채널
- Views: 조회수 1,885회
- Likes: 좋아요 25개
- Date Published: 2021. 1. 15.
- Video Url link: https://www.youtube.com/watch?v=SUdQpEc9O9k
Android) 안드로이드 Jsoup로 웹크롤링 하기 (예제포함)
반응형
Android Jsoup 웹크롤링
안드로이드 개발시에 Java Jsoup 사용하여 웹크롤링 연습해보기
웹크롤링 (Web Crawling) 이란?
– 웹 페이지와 수많은 사이트들의 HTML 소스를 끌어와서 필요한 정보와 자료를 수집하는 것
이런 웹 크롤링은 코딩으로 할 수 있는 자동화 작업 중에 가장 쉽게 접할 수 있으며, 가장 쓸 일이 많은 작업이기도 하다.
보통 웹크롤링은 파이썬 BeautifulSoup4, bs4라는 라이브러리를 사용해서 많이들 접한다.
나도 이 bs4라는 라이브러리를 활용해서 웹크롤링을 해본 경험이 있고, 블로그 포스팅도 하였다.
현재 이 포스팅은 내 블로그의 누적 조회수 1위에 꾸준히 머물러 있다.
위 포스팅에서는 파이썬 bs4로
현재 날씨와, 코로나 확진자, 뉴스 헤드라인, 멜론 Top10 을 크롤링하여
한번에 보여주는 유용한 프로그램을 만들어 보았다.
실제로 내 데스크탑에서도 자주 썼고, 아침에 일어나서 하루 날씨와 뉴스를 볼 때 유용하게 쓸 수 있었다.
하지만 내 주 개발 분야는 안드로이드 였고, 최근에 안드로이드에서 웹크롤링을 해서 위의 프로그램을 만들어보면 어떨까? 라는 생각을 하게 되었다.
그래서 찾아보니 파이썬의 bs4처럼, 안드로이드 자바에는 Jsoup 라는 라이브러리가 있는 것을 확인했다.
그럼 지금부터 시작해보자.
우선, 안드로이드 스튜디오를 켜고 새로운 프로젝트를 만든다.
나는 “데일리 브리핑” 이라는 앱을 만들어서, 출시까지 할 계획으로 시작했다.
현재 포스팅 시에는 이미 개발 완료 후 출시까지 한 상태이다.
프로젝트를 만들고, AndroidManifest.xml 에 들어간다.
웹크롤링을 위해 필요한 내용을 추가해줄 것이다.
//application 태그 안에 android:usesCleartextTraffic=”true” 이렇게 추가해주자.
인터넷 권한을 주는 코드와, http통신을 가능하게 해주는 코드이다.
그리고, gradle의 Module 수준 파일을 열어서 Jsoup 라이브러리를 implementation 시키자.
implementation ‘org.jsoup:jsoup:1.13.1’
그러면 이제 Jsoup를 사용할 기초 준비는 완료 되었다.
이제 본격적으로 웹크롤링을 시작할 것이다.
시작하기전에, 자기가 크롤링 해오고 싶은 정보를 정해야한다.
그렇기 때문에, 시작하기 전에 내가 만들고 싶은 앱에 대해 생각해보자.
앱 구상해본 스케치 도안
우선, 첫번째 화면은 현재 날짜와 시간을 보여줄 것이다.
그리고 두번째 화면으로 넘어가서 본격적으로 웹크롤링을 시작한다.
1. 날씨 , 2. 코로나 신규 확진자 , 3. 주요 뉴스 헤드라인
이렇게 총 3개를 크롤링해서 보여줄 생각이다.
우선, 안드로이드의 Activity 구동 구조를 알아보자.
액티비티가 실행되면, onCreate 메소드에서 우리가 원하는 코드들을 돌릴 수 있게 된다.
따라서 우리는 onCreate에 앱이 실행될 때 수행하는 코드를 작성하게 되는데
이 때 우리가 작성한 코드와 UI를 그리는 동작이 하나의 쓰레드에서 동시에 일어나게 된다.
우리가 Jsoup를 onCreate 에서 실행하게 되면, 웹크롤링 해오는 로딩시간에 앱이 정상적으로 UI를 그릴 수 없게 된다.
따라서 우리는 Thread를 하나 더 만들어주고, 그 쓰레드에서 웹크롤링을 수행할 것이다.
그러면 onCreate에서는 정상적으로 UI를 그리고 있고, 웹크롤링은 다른 쓰레드에서 처리하고 있기 때문에 정상 작동이 가능하다.
결론적으로, onCreate에서 하나의 쓰레드를 더 만들어서 웹크롤링을 수행할 것이고,
Handler를 사용해서 웹크롤링 쓰레드 -> 메인 쓰레드로 데이터를 주고받을 것이다.
이번 포스팅은 “1번. 날씨” 웹크롤링 부분에 대해서만 포스팅 할 것이다.
우선, 첫번쨰로 쓰레드를 하나 생성하자.
new Thread() { @Override public void run() { try { //크롤링 할 구문 } catch (IOException e) { e.printStackTrace(); } } }.start();
이렇게 new Thread() 를 사용하여 쓰레드를 하나 생성해주고
run() 메소드를 오버라이딩 한 후 try-catch 구문을 사용하여 예외처리를 해준다.
그리고 try구문 안에 우리가 원하는 웹크롤링 코드를 짜면 되는것이다.
우선, 날씨를 크롤링 해올 것인데
나는 ‘서울 날씨’ 에 대해서 크롤링 하고 싶다.
그래서 네이버에서 ‘서울 날씨’ 를 검색했다.
이부분 이라고 표시한, 저 기온 부분과 맑음 부분을 끌어오려고 한다.
저 사이트에 들어가서 f12를 누른다.
그럼 개발자 모드가 뜰 것이다.
25도 부분을 선택해서 보면, strong으로 묶여있고, 상위 div의 클래스 네임이 “temperature_text” 이다.
참고로 클래스 네임은 .class , id 네임은 #id , 즉 . 과 # 로 구분한다.
그럼 이제 우리가 원하는 값의 클래스네임과 자료형을 알았으니까
웹크롤링을 시작해보자.
우선 전역변수로 URL 상수를 지정해주자.
private String URL = “https://m.search.naver.com/search.naver?sm=mtp_hty.top&where=m&query=%EC%84%9C%EC%9A%B8+%EB%82%A0%EC%94%A8”;
그리고, 아까 만들었던 쓰레드의 try 구문 안에 웹크롤링 코드를 작성한다.
Document doc = Jsoup.connect(URL).get(); //URL 웹사이트에 있는 html 코드를 다 끌어오기 Elements temele = doc.select(“.temperature_text”); //끌어온 html에서 클래스네임이 “temperature_text” 인 값만 선택해서 빼오기 isEmpty = temele.isEmpty(); //빼온 값 null체크 Log.d(“Tag”, “isNull? : ” + isEmpty); //로그캣 출력 if(isEmpty == false) { //null값이 아니면 크롤링 실행 tem = temele.get(0).text().substring(5); //크롤링 하면 “현재온도30’c” 이런식으로 뽑아와지기 때문에, 현재온도를 잘라내고 30’c만 뽑아내는 코드 bundle.putString(“temperature”, tem); //bundle 이라는 자료형에 뽑아낸 결과값 담아서 main Thread로 보내기 }
주석을 자세하게 달아놔서 이해하기 편할 것 이다.
그럼 이제 메인 쓰레드에서의 처리를 해주자.
Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(@NonNull Message msg) { Bundle bundle = msg.getData(); //new Thread에서 작업한 결과물 받기 textView.setText(bundle.getString(“temperature”)); //받아온 데이터 textView에 출력 };
Handler 를 이용해서 새로운 쓰레드에서 했던 작업의 결과물을 주고받고 할 것이다.
아까 위에서 bundle 이라는 자료형에 결과물을 담아서, key값을 “temperature” 로 정해준 후 담아서 보냈다.
그럼 이제 메인쓰레드에서는 그걸 받아서 textView에 뿌려주면 되는 것이다.
네이버 ‘대전날씨’ 검색 후 크롤링 한 결과이다.
위에서 한 코드로는 “31’c” 까지 출력 가능한 것.
위에서 사용한 코드를 이용하여 계속 뽑아낼 수 있을 것이다.
그래서 제작 완료한 데일리 브리핑 어플
데일리 브리핑 어플
이런식으로, 현재 날짜와 시간을 표시 후에 간단한 인사말을 띄워준다.
인사말은 시간에 따라 동적으로 변한다.
그리고 밑에 준비된 버튼을 누르면 브리핑 화면으로 넘어간다.
사용자가 설정해둔 지역으로 크롤링 되며, 첫번째 칸에는 현재 날씨
두번째 칸에는 오늘 신규확진자수
세번째 칸에는 현재 주요 뉴스 헤드라인 을 보여준다.
모두 웹크롤링을 이용한 것이며, 위의 코드로 이루어져 있다.
다음엔 또 새로운 아이디어로 새로운 크롤링 어플을 만들어 봐야겠다.
급하게 써서 조금 뒤죽박죽인 감이 있지만
잘 모르는 부분이 있으면 댓글 달아주시면 답변 해드릴게요!
반응형
권장 브라우저 업데이트 안내
질문
현재 kt에서 “airmapkorea”라는 앱을 통해 전국 2000개의 미세먼지 측정소에서 측정한 미세먼지 데이터를 국민들에게 실시간으로 개방하고 있습니다. (감사하게도)
해당 서비스는 웹 말고 앱으로만 제공되고 있는 것 같습니다.
저는 해당 데이터를 크롤링을 통해 1분마다 서버에 저장을 하고싶은데,
앱 크롤링관련해서 검색을 해봐도 잘 나오지 않아서 질문드립니다.
1. 앱도 크롤링이 가능한가요?
2.해당 프로그램을 만들기 위해 어디에 문의해야하고, 금액은 어느정도가 될까요?
내공 1000(천) 걸었습니다.
부정확하거나 관련없는 답변은 신고합니다.
안녕하세요, 미세먼지에 관심이 있는 대학원생입니다.
🖨 ‘웹 크롤러’ 좀 그만 만들어라
🚨 주의: 이 포스트는 민감한 내용을 포함하고 있습니다. 욕설이 등장하므로 주의 해 주세요.
🤬 주의 : 욕설 레벨 2에 해당하는 문서입니다. 다소 불쾌 할 수 있습니다.
😠 무슨 말 할거냐?
거창한 이야기는 아니다. 인터넷에 존재하는 웹 크롤러 또는 웹 프론티어라고 불리우는 것들을 만드는 방법들을 읽고 생긴 답답함을 이곳에 조금 털어 놓으려고 한다.
인터넷에 ‘크롤러 만들기’를 쳤다하면 90% 확률로 파이썬으로 크롤러는 만드는 방법에 대해 잘 쓰여진 블로그가 수십개씩 검색 결과로 우수수 떨어지고 그 대부분이 Scrapy또는 셀레니움, BeautifulSoup4 등 을 사용해서 특정 웹 사이트의 페이지를 긁어내는 코드를 소개하고 있다.
대게 ‘어디 어디 페이지를 긁어서 변경 사항을 감지하고 Telegram 알림까지 연동 해 봅시다!’ 정도이다. 그러나 이것들은 크롤러라고 보기엔 어렵다. 대부분의 블로그들이 ‘나만의 웹 크롤러 만들기’ 따위의 제목으로 시작해서 심지어 코드들은 죄다 서로 빼다 닮았고 틀린 코드도 서로 붙여 넣으면서 크롤러를 만들어 보라고 독려하고 있다. 가장 큰 문제점 두 가지만 꼽아 보겠다.
🤔 웹 페이지 몇 개 긁는 걸 ‘크롤러’라고 할 수 없다.
웹 크롤러를 단순한 인터넷 장난감 정도로 생각하는 사람들이 많다. 나만의 코드로 나만의 알림 로봇을 제작하고 소개하는 정도에 그치는 블로그 글들이 너무나도 많기 때문이다. ‘크롤러’ 또는 ‘웹 프론티어’라고 불리는 것은 오랫동안 연구된 주제고 어떻게 하면 www의 수천 수백만개의 웹 페이지들을 잘 수집 할 수 있을까에 대한 고민이다.
내가 웹 컨텐츠 크롤링으로 박사 학위라도 받은 것도 아니라 감히 말하는 개인에 불과하지만 무분별하게 그저 그런 코드를 적당히 블로그에 올려두고 크롤러라고 소개하는 행위는 참을 수 없었다. 아래는 구글에서 크롤링을 검색 했을 때 나오는 크롤러의 기본과 개념에 대한 설명이다. 가장 심각하게 잘못된 개념을 전파하는 게시글들을 모았다.
크롤링(crawling) 이해 및 기본, 크롤링(crawling) 이란? – Web상에 존재하는 Contents를 수집하는 작업 (프로그래밍으로 자동화 가능) – HTML 페이지를 가져와서, HTML/CSS등을 파싱하고, 필요한 데이터만 추출하는 기법 – Open API(Rest API)를 제공하는 서비스에 Open API를 호출해서, 받은 데이터 중 필요한 데이터만 추출하는 기법 – Selenium등 브라우저를 프로그래밍으로 조작해서, 필요한 데이터만 추출하는 기법
Web crawling ? – web crawling : 자동적으로 화면에 있는 data를 가져오는 것 (실시간 연동, 자동으로 업데이트 됨) – web scrapping : 자동화 X / scrapping 하는 시점에서의 데이터만 갖고오기! => 두 가지 모두 웹 사이트를 분석해 원하는 데이터를 추출하는 과정이다.
크롤러의 개념에 대해서 제대로 설명하지 못했고 완전히 틀린 수준의 문장도 보인다. 크롤링은 결코 Open API를 제공하는 서비스를 사용해서 만드는 것이 아니다. API가 없어서 크롤러를 못 만든다면 과연 SW 엔지니어라고 할 수 있는가? 정말 크롤러란 셀레니움이랑 Open API를 사용해서 만드는 것이라고? 크롤러는 웹 사이트를 분석해 원하는 데이터를 추출하는 과정도 아니다.
또 크롤러는 ‘셀레니움을 써서 데이터를 추출 하는 것’이라고 보기에도 어렵다.셀레니움이 없으면 어쩔 건가? API가 없으면 어쩔 건가? 곧 바로 BeautifulSoup4를 사용해서 CSS 셀렉팅을 하는 코드를 올려 놓아서 실망했다.
각종 블로그에 소개된 크롤러들은 그냥 한 번 실행하면 끝나는 http request 정도에 불과하다. 그 때 그 순간에만 동작하고 target 웹 페이지의 DOM이 조금만 변경되어도 힘을 못 쓰는 병신 코드로 전락하고 마는 것이다. 그도 그럴것이 대부분 개발자 도구를 열고 CSS selector를 복사하라고 써 놓기 때문이다.
특히 ‘네이버 뉴스 크롤링’ 또는 ‘다음 뉴스 크롤링’ 등으로 검색해서 나오는 결과들은 그 중 최악이며 네이버나 다음의 페이지 구조는 주기적으로 바뀌므로 ‘웹 크롤러 만들기 2020년 최신’ 따위의 블로그 글이 설치는 이유가 바로 이것이다.
🤔 그럼 CSS selector를 안 쓰고 대체 오또케 본문 데이터를 긁죠?!! 라고 생각 하는 개발자가 있다면 지금 당장 대가리 박고 대학교로가서 알고리즘 수업을 다시 듣고 오길 바란다. CSS selector는 대충 생각해도 전혀 우아한 방법이 아니다. 📎 DOM based content extraction via text density 에서는 어떻게 웹페이지의 본문 DOM을 찾을 수 있는지 소개해 주고 있다.
🏗 웹 크롤러 아키텍쳐
다음은 간단한 ‘웹 크롤러’의 구조를 보여주고 있다.
🧭 Fetcher, Parser, Frontier
일단 Fetcher와 Parser, Frontier 세가지가 보인다. 과정을 이해하기 위해서는 먼저 Frontier부터 시작하면 좋다. 이 디지몬 Frontier가 먼저 탐색할 URL을 Fetcher에게 넘겨 주면 Fetcher는 해당 페이지의 html 내용을 가져와서 Parser에게 넘겨 준다. Parser에서는 다른 하이퍼링크를 찾는다. 보통 html의 a태그나 url로 보임직 하는 것들이다. 여기서 찾은 이 URL들을 다시 또 Fetcher가 방문하게 되는데 이 때 방문 했던 곳을 또 방문 하면 무한 loop가 되므로 Dup URL Elim에서 이미 방문한 URL과 중복 URL들을 제거한 채로 디지몬 Frontier에게 전달 해 준다.
잠깐만! 구구절절하게 써 놓긴 했지만 이 모든 과정은 사실 우리가 알고리즘에서 배웠던 DFS나 BFS와 완벽하게 같은 과정이 아닌가?. 더 이상 방문 페이지가 없을 때 까지 URL을 계속해서 탐색하는 것이다. 극단적으로 말해서 크롤러는 월드 와일드 웹, www을 대상으로 DFS또는 BFS를 하는 것 뿐이다. 그렇지만 웹 세상은 워낙 넓어서 탐색을 하는 도중에도 새로운 URL이 생기고 또 페이지 내용이 수정 된다. 이런 과정을 어떻게하면 최적화 할 수 있을까?라는 고민 역시 크롤러 연구의 한 부분이다.
👁 Content Seen
방문한 페이지의 ‘본문 내용’이 이미 전에 다른 곳에서 본 내용인지 아닌지 판단하는 부분이다. Doc FP’s라고 적힌것은 Document Finger Prints를 줄인 것인데 FP란 어떤 Document의 내용을 구분 할 수 있는 고유한 Hash 값이라고 생각하면 좋다. 이 부분 하나만 하더라도 공부할 내용이 정말 많고 방대해서 여기서는 설명하지 않고 넘어가려고 한다. FP를 만드는 방법 역시 여러가지고 FP로 어떻게 ‘중복 문서’를 걸러 낼까? 고민하는 것도 하나의 분야다. 한국어로 정리가 되어 있는 링크를 아래에 적어 둔다. 영어로 알아보고 싶다면 ‘Near Duplicated Document Detection’라는 키워드로 검색 해 보자.
📎 문서 단위로 유사 중복을 판별하는 방법
또 실제 운영 되는 크롤러는 DNS 서버까지 따로 두기도 하기에 그림 상 DNS라는 것도 보이지만 DNS는 또 하나의 큰 주제이므로 이 글에서 다루지는 않겠다.
⌛️ History
내가 혼자 망상에 사로잡혀서 “이건 예술적이지 않아! 이건 크롤러가 아냐!”라고 외치는게 아니라 1999년에 우리 멋쟁이 Marc Najork라는 사람이 어떻게 확장성 있는 웹 크롤러를 만들 수 있는지 유명한 논문을 출간 했다. 이 논문의 서론을 보면 재밌는 말이 등장 한다.
“‘확장성 있는 웹 크롤러’는 웹 서비스에서 매우 중요한 컴포넌트인데 그 크롤러 디자인에 대해선 잘 정립 되어 있지 않다.”
Scalable Web crawlers are an important component of many Web services, but their design is not well‐documented in the literature 📎 Mercator: A scalable, extensible Web crawler, 1999
그로부터 10년 뒤, Marc Najork는 MS 연구소에 들어가서 아래와 같은 논문을 또 썼다. 서론에 이런 글이 써 져 있다.
“웹 크롤러란? seed URL을 주면 관련된 URL을 찾아 내고, 그 URL들에서 또 다른 하이퍼 링크를 찾아내고 계속해서 이 과정을 반복하며 하이퍼 링크들을 다운로드하는 프로그램이다.”
A web crawler is a program that, given one or more seed URLs, downloads the web pages associated with these URLs, extracts any hyperlinks contained in them, and recursively continues to download the web pages identified by these hyperlinks. 📎 Web Crawler Architecture, MARC NAJORK
Microsoft Research, 2009
🤮 논문? 요즘은 Youtube가 대세지 누가 ‘글’을 시간 들여서 읽나? 그렇다면 Marc Najork가 MS 인턴으로 나무 하면서 했던 발표 영상을 보자. 발표를 듣는 사람이 5명 정도 밖에 없어 매우 조촐 해 보인다. 어떻게 수백만개의 페이지를 크롤링 하도록 최적화 할 수 있는지 기초 컨셉을 알 수 있다.
📎 Atrax, a distributed web crawler
웹 크롤링은 태초에 www가 생겼을 때 부터 아주 오랫동안 고민되고 연구 해 온 주제이다.📎 Web Crawler: A Review라는 논문의 2.1에 있는 The History of Web Crawler를 읽어 보는 것을 추천한다. 재밌는 내용들이 많다.
“앞으로 블로그에 크롤러 만드는 법을 쓸거 같으면 적어도 이 정도는 알고 써라 이 머저리들아”라고 말하고 싶은건 절대 아니다. 내가 하고 싶은 말의 요점은 어중이 떠중이 코드 몇 줄 써놓고 ‘크롤러’등으로 소개하는 꼴을 보니 아주 신물이 난다는 것이다.
“마케터도 코딩 배우는 시대!”, “시작하자! 니도 코딩 해야한다!” 따위의 좆같은 문구가 판을 치면서 개발자로 변신하라고 광고를 해 대고 1회용 코드 갖다 박아 놓고 ‘크롤러 만들기’, ‘데이터 수집 강의’로 돈을 받아 먹는게 현실이다.
🤖 robots.txt 윤리에 대한 설명이 없음.
너도 나도 다 같이 웹 페이지를 긁어서 슬랙, 텔레그램 알림 연동까지 해서 재밌게 놀아보자는 말은 신나게 하는데 robots.txt 룰에 대해서 설명하는 블로그는 여지껏 거의 본적이 없다. 웹 페이지라고 해서 아무렇게나 긁어서는 안되고 robot.txt에 작성된 룰에 따라 수집을 해도 되는 페이지가 있고 수집을 해선 안되는 페이지가 있다. 궁금하면 긁으려는 페이지 루트 도메인에서 /robots.txt에 들어가 보도록 하자. 뭔 짓거릴 해도 되고 뭔 짓거릴 해선 안되는지 간곡히 부탁하는 내용이 쓰여져 있다.
https://www.google.com/robots.txt
각 사이트 별로 루트 경로의 robots.txt에 로봇룰이 적혀 있으며 ‘크롤러’를 만든다면 이 룰을 따라 주는 것이 윤리적이라 할 수 있다. 크롤러를 만드는 방법에 대해서 소개한다면 적어도 이 로봇룰에 대해선 설명 해 줘야 한다.
구글은 robots.txt를 검색엔진 크롤러에서 사이트에 요청할 수 있거나 요청할 수 없는 페이지 또는 파일을 크롤러에 지시하는 파일이라고 정의하고 있다. 번역 과정을 거치면서 자연스러운 한국어가 아니라 다소 이해하기 어려운데 나름 쉽게 번역 해 보면 크롤러가 요청을 해도 되거나, 해선 안되는 경로를 적어 둔 곳 정도가 될 것 같다. 그 외에도 robots.txt에는 몇 초 간격으로 요청을 보내도 되는지 등 다양한 내용을 적을 수 있다.
⚠️ 불법 크롤링 크롤링으로 수집한 데이터로 이익을 취하면 문제가 될 수 있다. 경쟁 업체 데이터를 크롤링해서 실형 떨어진 개발자도 있다. 좆되지 않게 조심해라. 아래 사례는 단순히 DOM 파싱해서 가져가는 정도가 아니라 아예 API endpoint를 조진게 문제긴 하다. 📰 法 “여기어때, 야놀자 정보 무단수집 맞다”…前 대표 ‘유죄’
그러나 지금까지도 내가 구글에 ‘크롤러 만들기’로 검색했을 때 robots.txt에 대해 설명하는 글은 상위에서 단 하나도 찾아 볼 수 없다. 19년도에 인터넷 표준화 기구의 메모에 robots.txt가 사실상 웹 크롤링의 표준이 되어가고 있다고 쓰여져 있다. 이것도 구글이 제출한 문서긴 한데 재밌게 읽어 볼만 하다. 📎 Robots Exclusion Protocol
웹 크롤러를 만들 수 있는 오픈 소스들은 자기네 프레임워크의 기능 중 하나로 ‘robot.txt를 준수합니다.’라고 소개하고 있다. 이 오픈 소스 크롤러를 사용하면 robot.txt를 준수할 수 있게 된다고 광고하는 셈이다. 이 부분에 대해서 우리도 한 번 생각 해 볼 필요가 있다. 📎 gocolly라는 웹 크롤러 오픈소스의 기능 소개에는 robots.txt support라고 적어 둔 부분을 주목하자
또 Pinterest의 경우 자사의 크롤러가 어떻게 동작하는지, 어떤 User Agent를 갖고있고 어떤 IP 대역을 사용하는지 공개하고 있다. 이 와중에 국내 블로그, 커뮤니티의 어떤 글도 크롤러의 robots.txt에 대해 설명하지 않고 있다는 점은 반드시 짚고 넘어 가야 할 문제다.
📎 Pinterest crawler
👺 “그래서 어쩌자고”
크롤러가 아니라 뭐 다른 이름을 갖다 붙이기라도 하잔 말이냐? 그런 대안 없다. 개발자들의 전형적인 말 중 하나인데 “문제를 지적하려면 대안을 갖고 오세요”다. 회사 생활을 하면 ‘진짜 다방면으로 훌륭한 해결책’을 마련하지 않으면 회의에서 찍소리도 하지 않는 것이 규범이다.
내가 무슨 크롤링 학계에서 저명한 박사나 교수도 아니고 용어 가지고 거들먹 거릴 순 없다. 내가 하고픈 말은 단지 ‘크롤러’는 상당히 오랫동안 연구된 주제고 언제까지고 scrapy나 쓰면서 ‘2019 다음 뉴스 크롤링’, ‘2020 다음 뉴스 크롤링’… 같은 글에 평생 의존 할 수는 없다는 것과 잘못된 크롤러의 개념이 인터넷 곳곳에 퍼지는 걸 막자는 것이다.
‘크롤러란 셀레니움으로 페이지 긁는것’으로 잘못된 개념이 인터넷에 떠돌아 다니는걸 SW 개발자로서 입 닫고 지켜보기엔 나는 너무나도 지독한 공대생이다.
A crawler’s purpose is to follow links to reach numerous pages and analyze their meta data and content.
Scraping is possible out of the web. For example you can retrieve some information from a database. Scraping is pulling data from the web or a database.
📘 더 읽어 볼 거리
📎 웹 크롤러
그렇다고 크롤러 관련해서 설명한 글이 전혀 없는 건 아니다. 잘 설명 했다고 생각하는 글이다.
📎 로봇 메타 태그, data-nosnippet 및 X-Robots-Tag 사양
구글의 웹 크롤러가 나의 블로그나 콘텐츠를 수집하지 못하도록 제한 하는 방법에 대해서 설명 하고 있다. robots.txt의 연장선이다.
📎 Marc Najork, Research Engineering Director in Google Research
글 중간에 소개 했던 멋쟁이 Marc Najork는 이제 구글 리서치에서 근무하고 있다. 검색과 크롤링에 관심이 있다면 아주 재미있게 읽을 수 있는 논문들이 많다. 내 병신 같은 글 보다 이 박사의 Abstraction 한 문단이 여러분에게 훨씬 값지고 인생에 도움이 되니까 꼭 봐라. 요즘은 랭킹을 연구하는 모양이다.
📎 Google 검색의 원리 | 크롤링 및 색인 생성
시간 없고 빨리 IR과 크롤러의 개념 둘 다 이해하고 싶은 사람에게 강력 추천하는 글이다. 구글에서 설명해주는 검색의 원리이다. 검색 프로세스 전체를 쭉 둘러 보기에 시야가 확 넓어 질 것이다.
😡 “뭐 제대로 설명 한 것도 없는데 논문 링크만 냅다 박아 놓으면 땡이냐?” 미안하게 생각합니다. 나도 여깄는거 다 보진 않았고 요즘도 읽어가는 중이라 기회가 되면 정리를 해 보려고 합니다… 진짜 관심 있는 사람 있으면 댓글로 뭐라도 남기면 수요를 봐서 글을 쓰겠습니다.
[Python] 구글 플레이 스토어 크롤러 코드 Version 2.0.2
728×90
반응형
안녕하세요!
오늘은 파이썬(주피터 노트북)을 기반으로 직접 코딩한 구글 플레이 스토어 웹 크롤러 코드를 공유합니다.
📝 목차
1. 업데이트 Log
2. 주요 기능
3. 전체 코드
4. 필수 초기 세팅
5. 코드 및 설명
1. 업데이트 Log
📌 Last Updated @2022-07-19(‘더보기’로 확인가능✅)
더보기 1) 업데이트 내역 크롤링 작업 이후인 ‘HTML 데이터 저장’ 섹션 직전 로직에 driver.quit() 코드 추가 2) 업데이트 배경 실행된 이력이 있는 크롬 드라이버를 완벽하게 종료하지 않고 새로운 크롬 드라이버를 오픈하여 크롤링하는 경우 메모리 누수 발생
크롤링이 완료되면 모든 크롬 드라이버를 강제 종료하여 메모리 누수 방지
@2022-06-22
더보기 1) 업데이트 내역 웹 크롤링 함수 내 ‘리뷰 모두 보기’ 버튼 path 수정 AS-IS all_review_button_xpath = ‘/html/body/c-wiz[2]/div/div/div[1]/div[2]/div/div[1]/c-wiz[3]/section/div/div/div[5]/div/div/button/span’ TO-BE (정상 동작 확인) all_review_button_xpath = ‘/html/body/c-wiz[2]/div/div/div[1]/div[2]/div/div[1]/c-wiz[4]/section/div/div/div[5]/div/div/button/span’
2) 업데이트 배경 구글 플레이 스토어 내 ‘리뷰 모두 보기’ 버튼의 HTML Path 변경(@Tony.P 님의 댓글 제보😊)
@2022-01-27
더보기 1) 업데이트 내역 구글 플레이 스토어 웹 페이지 내 ‘리뷰 모두 보기’ 버튼 클릭 시 리뷰 데이터가 출력되는 Modal Window 자동 무한 스크롤 기능 추가 무한 자동 스크롤 불가 문제 해결 수집 가능한 최대 리뷰 개수 제한 해결
개편된 웹 페이지 구조를 고려한 코드 수정 데이터 가져올 클래스명 수정 기존에 존재했던 장문 리뷰의 ‘모두 보기’ 기능이 삭제됨에 따라 단문/장문에 따라 리뷰 내용 가져오는 코드 삭제
코드 리팩토링
데이터 종류별로 배열을 사용하지 않고, 하나의 리뷰당 하나의 배열 원소로 사용할 수 있도록 수정
2) 업데이트 배경 최근에 구글 플레이 스토어 웹페이지가 개편됨에 따라, 이전 포스팅에서 업로드했던 구글 플레이 스토어 웹 크롤러가 작동하지 않는다는 연락을 많이 받았습니다. 자동 스크롤이 동작하지 않거나 최대 수집 가능한 리뷰 개수가 40개로 제한된다는 등의 문의였습니다. 저의 포스팅이 누군가에게 조금이나마 도움을 줄 수 있다는 점에 참 뿌듯합니다. 이러한 많은 관심에 화답하고자 개편된 웹페이지 구조에 맞춰 크롤러를 업데이트하였습니다.
2. 주요 기능
1) 구글 플레이 스토어 App 사용자 리뷰 자동 수집(그림 1)
리뷰 등록일
작성자 닉네임
리뷰 평점
리뷰 내용
그림 1. App 리뷰 수집을 위한 브라우저 자동 제어 모습
(2) Parsing 한 데이터 html 문서로 저장
(3) 수집 데이터는 아래와 같이 데이터프레임 형태로 포매팅(그림 2)
그림 2. 수집 데이터 포맷
2. 전체 코드
크롬 드라이버 세팅, 필요 패키지 설치, 간단한 파일 경로 편집이 가능하신 분은
이 문서(master branch)를 참고하셔서 필요한 부분을 이용하시면 되겠습니다 🙂
https://github.com/park-gb/playstore-review-crawler
3. 필수 초기 세팅
이제부터 차근차근 웹 크롤러 구현 방법을 소개합니다.
혹시라도 잘 안 되는 부분이 있다면 아래에 👇👇👇 댓글 남겨주세요!
해결책을 찾아드릴 수 있도록 노력하겠습니다👨💻🔥
1) 코드 다운로드
Github 링크 이곳을 클릭하셔서 코드를 포함한 파일을 설치해 줍니다(그림 3).
master 브랜치를 이용해 주세요.
그림 3. 소스코드 및 필요한 파일 다운로드
(1) 초록색 버튼 ‘Code’를 클릭
(2) ‘Download ZIP’ 클릭(git이 설치되어 있으신 분들은 clone 하셔도 됩니다)
(3) 다운로드한 알집 해제
2) 크롬 설치
크롬 미설치자는 이곳을 클릭하셔서 설치해 주시기 바랍니다. 크롬은 구글에서 개발한 브라우저입니다.
3) 크롬 드라이버 설치
(1) 이곳을 클릭해 사용 중인 크롬 버전을 확인합니다.
(2) 이곳을 클릭해 버전에 맞는 크롬 드라이버를 설치합니다.
(3) 설치한 크롬 드라이버는 Github에서 다운로드한 폴더 안으로 이동시킵니다.
4. 코드 및 설명
4.1. 기본 세팅
이제 Github에서 설치한 주피터 노트북을 오픈합니다. src 폴더 안에 있습니다.
1) 크롬 드라이버 설정
파일 확장자 이름 사용 여부에 따라 앞서 chromedriver 파일명을 수정합니다.
# chrome_driver = ‘../chromedriver.exe’ # 파일 확장자 이름 표기 chrome_driver = ‘../chromedriver’ # 파일 확장자 이름 미표기
2) 수집할 앱 주소 입력
구글 플레이 스토어에서 수집할 App 검색 후 App을 선택합니다.
아래 그림 4 빨간 박스처럼 선택한 App 소개 페이지의 URL 링크를 복사하여 소스코드 내 url 변수에 할당해 줍니다.
그림 4. 수집할 App URL 가져오기
URL = “https://play.google.com/store/apps/details?id=com.github.android”
3) 파이썬 패키지 설치
pip install beautifulsoup && pip install selenium && pip install pandas && pip install tqdm
beatuiful soup: HTML/XML 문서 parsing
selenium: 브라우저 동작 자동 제어
pandas: 데이터 분석 라이브러리
tqdm: 작업 프로세스 바(progress bar) 시각화
4) 패키지 불러오기
import requests from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import time from time import sleep import random from tqdm.auto import tqdm, trange import pandas as pd
4.2. 크롤링 코드
1) 무한 스크롤 함수
구글 플레이 스토어 내 리뷰는 Modal Window를 통해 무한 스크롤 형태로 제공됩니다.
즉, 스크롤할 때마다 새로운 사용자 리뷰를 계속 보여주는 형태입니다.
따라서 모든 리뷰를 확인하려면 창 맨 아래까지 스크롤해야 합니다.
아래 코드는 이를 위한 함수입니다.
def scroll(modal): try: # 스크롤 높이 받아오기 last_height = driver.execute_script(“return arguments[0].scrollHeight”, modal) while True: pause_time = random.uniform(0.5, 0.8) # 최하단까지 스크롤 driver.execute_script(“arguments[0].scrollTo(0, arguments[0].scrollHeight);”, modal) # 페이지 로딩 대기 time.sleep(pause_time) # 무한 스크롤 동작을 위해 살짝 위로 스크롤 driver.execute_script(“arguments[0].scrollTo(0, arguments[0].scrollHeight-50);”, modal) time.sleep(pause_time) # 스크롤 높이 새롭게 받아오기 new_height = driver.execute_script(“return arguments[0].scrollHeight”, modal) try: # ‘더보기’ 버튼 있을 경우 클릭 all_review_button = driver.find_element_by_xpath(‘/html/body/div[1]/div[4]/c-wiz/div/div[2]/div/div/main/div/div[1]/div[2]/div[2]/div/span/span’).click() except: # 스크롤 완료 경우 if new_height == last_height: print(“스크롤 완료”) break last_height = new_height except Exception as e: print(“에러 발생: “, e)
2) 리뷰 페이지 오픈
아래 코드는 초기에 설정한 앱 URL에 접근하고 페이지가 잘 로딩되어 있는지 확인합니다.
특정 앱의 모든 리뷰를 보는 페이지가 다른 URL로 구분하지 않고
‘리뷰 모두 보기’ 버튼을 클릭하여 Modal Window를 통해 출력됩니다.
따라서 해당 버튼을 클릭하는 코드 역시 추가하였습니다.
# 크롬 드라이버 세팅 driver = webdriver.Chrome(chrome_driver) # 페이지 열기 driver.get(URL) # 페이지 로딩 대기 wait = WebDriverWait(driver, 5) # ‘리뷰 모두 보기’ 버튼 렌더링 확인 all_review_button_xpath = ‘/html/body/c-wiz[2]/div/div/div[1]/div[2]/div/div[1]/c-wiz[4]/section/div/div/div[5]/div/div/button/span’ button_loading_wait = wait.until(EC.element_to_be_clickable((By.XPATH, all_review_button_xpath))) # ‘리뷰 모두 보기’ 버튼 클릭 driver.find_element_by_xpath(all_review_button_xpath).click() # ‘리뷰 모두 보기’ 페이지 렌더링 대기 all_review_page_xpath = ‘/html/body/div[4]/div[2]/div/div/div/div/div[2]’ page_loading_wait = wait.until(EC.element_to_be_clickable((By.XPATH, all_review_page_xpath)))
3) 무한 스크롤 함수 호출
리뷰 데이터가 출력되는 Modal Window의 xpath 경로를 스크롤 함수에 전달하여,
해당 창의 맨 아래까지 자동으로 스크롤하는 함수를 호출합니다.
# 페이지 무한 스크롤 다운 modal = WebDriverWait(driver, 2).until(EC.element_to_be_clickable((By.XPATH, “//div[@class=’fysCi’]”))) scroll(modal)
4) HTML Parsing
이제 전체 웹 페이지 소스를 받아오고 Beautifulsoup 패키지를 활용해 parsing 합니다.
# html parsing하기 html_source = driver.page_source soup_source = BeautifulSoup(html_source, ‘html.parser’)
이제 아래 그림 5와 같이 웹 페이지가 자동으로 열리고 모든 리뷰 데이터가 Modal Window에 로딩될 때까지 무한 스크롤이 진행됩니다.
그림 5. App 리뷰 수집을 위한 브라우저 자동 제어 모습
5) 크롬 드라이버 종료
메모리 누수 방지를 위해 크롤링을 완료한 크롬 드라이버는 모두 강제 종료해 줄 필요가 있습니다.
driver.quit()
6) HTML 데이터 저장
parsing 한 데이터 자체를 html 파일로 저장합니다.
추후에 추가적인 크롤링 작업 없이도 해당 웹 페이지의 전체 데이터를 활용하기 위함입니다.
# html 데이터 저장 with open(“../dataset/data_html.html”, “w”, encoding = ‘utf-8’) as file: file.write(str(soup_source))
4.3. 데이터 프레임 변환
이제 리뷰 등록일, 작성자 닉네임, 리뷰 평점, 리뷰 내용 데이터를 데이터프레임 형태로 변환해 보겠습니다.
리뷰 등록일의 경우, ‘yyyymmdd’ 포맷과(e.g., 20211001), 연도, 월, 일 정보를 각각 나누어 저장하겠습니다.
그 이유는 시계열(Time Series) 분석에 활용하기 위함입니다.
필요에 따라 원하는 유형의 데이터를 사용하시길 바랍니다.
# 리뷰 데이터 클래스 접근 review_source = soup_source.find_all(class_ = ‘RHo1pe’) # 리뷰 데이터 저장용 배열 dataset = [] # 데이터 넘버링을 위한 변수 review_num = 0 # 리뷰 1개씩 접근해 정보 추출 for review in tqdm(review_source): review_num+=1 # 리뷰 등록일 데이터 추출 date_full = review.find_all(class_ = ‘bp9Aid’)[0].text date_year = date_full[0:4] # 연도 데이터 추출 # 해당 단어가 등장한 인덱스 추출 year_index = date_full.find(‘년’) month_index = date_full.find(‘월’) day_index = date_full.find(‘일’) date_month = str(int(date_full[year_index+1:month_index])) # 월(Month) 데이터 추출 # 월 정보가 1자리의 경우 앞에 0 붙이기(e.g., 1월 -> 01월) if len(date_month) == 1: date_month = ‘0’ + date_month date_day = str(int(date_full[month_index+1:day_index])) # 일(Day) 데이터 추출 # 일 정보가 1자리의 경우 앞에 0 붙여줌(e.g., 7일 -> 07일) if len(date_day) == 1: date_day = ‘0’ + date_day # 리뷰 등록일 full version은 최종적으로 yyyymmdd 형태로 저장 date_full = date_year + date_month + date_day user_name = review.find_all(class_ = ‘X5PpBb’)[0].text # 닉네임 데이터 추출 rating = review.find_all(class_ = “iXRFPc”)[0][‘aria-label’][10] # 평점 데이터 추출 content = review.find_all(class_ = ‘h3YV2d’)[0].text # 리뷰 데이터 추출 data = { “id”: review_num, “date”: date_full, “dateYear”: date_year, “dateMonth”: date_month, “dateDay”: date_day, “rating”: rating, “userName”: user_name, “content”: content } dataset.append(data)
데이터프레임 저장
이제 추출한 데이터를 데이터프레임 형태로 바꿔주고 이를 csv 파일로 저장합니다.
df = pd.DataFrame(dataset) df.to_csv(‘../dataset/review_dataset.csv’, encoding = ‘utf-8-sig’) # csv 파일로 저장
데이터 불러오기
앞서 저장한 데이터가 정상적으로 저장되었는지 확인합니다(그림 6).
# 저장한 리뷰 정보 불러오기 df = pd.read_csv(‘../dataset/review_dataset.csv’, encoding = ‘utf-8-sig’) df = df.drop([‘Unnamed: 0’], axis = 1) # 불필요한 칼럼 삭제 df
그림 6. 수집 데이터 포맷
“이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.”
포스팅 내용에 오류가 있을 경우 아래에 👇👇👇 댓글 남겨주시면 감사드리겠습니다 🙂
그럼 오늘도 즐겁고 건강한 하루 보내시길 바랍니다.
고맙습니다.
728×90
반응형
[파이썬Python-웹 스크래핑] 구글 플레이 스토어 앱 리뷰 크롤링
반응형
주의!
구글 플레이 스토어 프론트가 최근에 개편 되었더군요. 당연히 마크업 구조도 수정되었고, 본 포스팅의 코드는 무용지물이 되었습니다. 해서 새로 개편된 구조에 맞는 웹 크롤러를 새로 프로그래밍했으니 아래 포스팅 참고해주세요.
평소 웹 스크래핑에 관심이 많습니다.
주로 투자에 도움이 될 만한 경제/재무지표를 수집하는 데 사용하고 있지만
가끔은 다른 관심 있는 이슈에 대한 정보를 얻을 때에도
웹 스크래핑 혹은 웹 크롤링을 사용합니다.
최근에는 안드로이드의 앱 마켓인 ‘구글 플레이 스토어’에서
관심 있는 앱의 리뷰 데이터를 수집하는 크롤러를 만들어봤습니다.
이 페이지에서 개발자가 단 답글은 제외하고 사용자의 리뷰와 별점만 수집
참고로 이 포스팅은 파이썬에 대한 기본 지식이 있는 사람들을 위해 작성했지만,
기본 지식 없이(=코드에 대한 이해 없이) 기계적으로만 따라하셔도
URL만 바꿔 입력하시면 원하는 결과물을 얻는 데는 무리가 없을 겁니다.
만약 크롤링 작업의 핵심 툴인 파이썬 셀레니움(selenium)에 대한 기초를 익히고 싶다면
아래 포스팅을 먼저 읽어보세요.
작업환경
1) 파이썬3.7(32bit)
2) 파이썬IDE Anaconda JupyterNotebook
3) 본 크롤러는 크롬 확장프로그램의 도움으로 작동하기 때문에 사전에 크롬이 설치되어 있어야 합니다.
4) 또한 Selenium을 사용하기 때문에, 크롬드라이버(ChromeDriver)를 다운받아서 앞으로 작성할 파이썬 코드(.py)가 저장될 폴더에 함께 넣어두어야 합니다.
① 먼저 우리 크롬 브라우저의 버전을 확인합니다 :
크롬 브라우저 우상단의 메뉴 > 도움말 > Chrome정보(아래 스샷 참고)
② 아래 링크된 페이지에서 우리 버전 및 운영체제에 맞는 크롬 웹드라이버를 다운 받습니다.
③ 다운 받은 압축파일의 내용물을 코드가 저장된(될) 폴더에 압축 해제합니다. 반응형 코드
아래의 코드 스니펫들을 모두 합치면 앱 리뷰 크롤러가 됩니다.
크롤링하고자 하는 리뷰 페이지의 URL을 입력받습니다.
이 때 URL은 “리뷰 모두 보기”를 클릭한 후의 페이지 URL이어야 합니다(아래 스크린샷 참고).
# 크롤링하고자 하는 리뷰 페이지의 url을 적어준다. url = input(‘스크래핑할 URL 주소를 입력 :’)
다음으로 “리뷰 모두 보기” 페이지에서
페이지를 끝까지 스크롤 다운해 모든 리뷰 콘텐트가 페이지 내 노출되도록 하는 코드입니다.
‘크롬에서 해당 페이지를 열어 스크롤을 끝까지 다운’하는 행위는
우리가 직접 하는 것이 아니라 selenium 패키지가 대신 해줍니다.
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time options = Options() options.add_argument(‘–kiosk’) # 화면을 전체화면으로 열어주기 위해서 driverPath = “chromedriver.exe” # 크롬드라이버 설치된 경로. 파이썬(.py) 저장 경로와 동일하면 그냥 파일명만 driver = webdriver.Chrome(driverPath, options=options) # Open Chrome driver.get(url) # 위의 패러그래프에서 입력한 URL SCROLL_PAUSE_TIME = 2 SCROLL_TIMES = 4 # 4번 스크롤 후 더보기 버튼 생성되기에 4 CLICK_PAUSE_TIME = 2 # 리뷰 페이지의 마지막까지 스크롤 다운하기 위해 페이지의 높이를 return last_height = driver.execute_script(“return document.body.scrollHeight”) # 스크롤 가장 아래까지 내리기 (‘더보기’ 누르면서) while True: for i in range(SCROLL_TIMES): driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”) time.sleep(SCROLL_PAUSE_TIME) # 스크롤 다운 사이에 2초의 인터벌을 두어 에러를 방지 # 중간중간 ‘전체 리뷰’ 버튼 누르기 spread_review = driver.find_elements_by_xpath(“//button[@jsaction=’click:TiglPc’]”) for i in range(len(spread_review)): isTrue = spread_review[i].is_displayed() if isTrue: driver.execute_script(“arguments[0].click()”, spread_review[i]) time.sleep(CLICK_PAUSE_TIME) more_button = driver.find_elements_by_xpath(“//span[@class=’RveJvd snByac’]”) # ‘전체 리뷰’ 버튼이 있다면 눌러준다 if more_button: more_button[0].click() # 더이상 내려가는 곳이 없으면 break new_height = driver.execute_script(“return document.body.scrollHeight”) if new_height == last_height: break last_height = new_height
제가 이 리뷰 페이지에서 수집하고자 하는 요소는
‘앱 이름’, 사용자의 ‘리뷰 내용’ 그리고 ‘별점’입니다.
각 수집 요소를 데이터프레임 형식으로 차곡차곡 쌓을 겁니다.
# 수집 대상 요소를 컬럼으로 하는 빈 DF 생성 data = pd.DataFrame(data=[], columns=[‘앱이름’, ‘리뷰’, ‘별점’]) # 앱 이름 app_name = driver.find_element_by_css_selector(‘.AHFaub’) # 리뷰 내용 review = driver.find_elements_by_xpath(“//span[@jsname=’bN97Pc’]”) # 별점 score = driver.find_elements_by_xpath(‘//div[@class=”pf5lIe”]/div[@role=”img”]’) # for loop 구문 통해 각 요소의 데이터를 수집 for i in range(len(review)): tmp_df = [] tmp_df.append(app_name.text) tmp_df.append(review[i].text) tmp_df.append(score[i].get_attribute(‘aria-label’)) tmp_df = pd.DataFrame(data=[tmp_df], columns=data.columns) data = pd.concat([data,tmp_df]) print(app_name.text + “앱 리뷰 수집 완료”) # 인덱스 번호를 다시 0부터 리셋 data.reset_index(inplace=True, drop=True) data.head()
수집한 데이터프레임을 보니 별점 데이터가
“별표 5개 만점에 N개를 받았습니다.”라는 문자열이었네요(아래 스크린샷).
N에 해당하는 숫자만 남기고 나머지는 제거하도록 하겠습니다.
# 원본 데이터 카피 tmp = data.copy() # 앞의 별표 5점은 생략. 정규 표현식을 사용해 숫자만 추출. “별표 5개”를 생략 tmp[‘별점’] = tmp[‘별점’].apply(lambda x: x[5:]) # re 라이브러리를 임포트 후 정규표현식 사용 import re ”’ 정수형 숫자 1개만 있거나, 4.8 과 같이 소수점으로 계산된 점수를 추출 [0-9]는 0부터 9까지의 숫자 중 하나를 의미 “\”는 뒤에 오는 “.”를 정규표현식이 아니라 있는 그대로의 문자열(“.”)로서 인식하도록 함 “.”은 어떤 문자든 1개가 등장함을 의미 *은 앞의 문자(숫자, 특수문자 포함)가 0개 이상 등장함을 의미 ”’ m = re.compile(‘[0-9][\.0-9]*’) tmp[‘별점’] = tmp[‘별점’].apply(lambda x : m.findall(x)[0]) tmp.head(3)
이제 데이터프레임에는 전처리까지 완료된 데이터가 깔금하게 들어가 있습니다.
데이터를 CSV와 XLSX 형식으로 각각 저장하고 마치겠습니다.
# 다양한 형식으로 저장 tmp.to_csv(app_name.text+’_리뷰평점.csv’, encoding=’utf-8′) # CSV로 tmp.to_excel(app_name.text+’_리뷰평점.xlsx’) # xlsx로
반응형
[리뷰 크롤링] AppStore 어플 리뷰 가져오기 1(feat. cURL)
728×90
반응형
2020/07/23 – [Python] – [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 1(feat. selenium)
2020/07/25 – [Python] – [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 2(feat. selenium)
2020/07/27 – [Python] – [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 3(feat. selenium)
2020/07/28 – [Python] – [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 4(feat. selenium)
지난 시간에는 python의 selenium이라는 패키지로 온라인상 행동을 조작하여 안드로이드의 PlayStore에서 리뷰를 크롤링 하는 것을 해보았다.
이번 시간에는 사과사의 AppStore에서의 리뷰를 가져오는 것을 해보려한다.
사실상 내가 원하던 리뷰는 “라이프 플러스”라는 컨탠츠 앱이다. 사용해본 사람은 알겠지만, 데이트 코스나 맛집등을 알려주기도 하고 경제 상식등과 같은 컨텐츠를 다루는 어플이다.
그렇기 때문에 젊은 층의 사람들에게 인기가 있다고 짐작해볼 수 있다. 거기다가 좀 더 연장해서 생각하자면 젊은 사람들의 절반 정도가 아이폰을 사용한다는 통계를 본 적 있다.(휴대기기 통계, 2019)
그러므로 안드로이드의 리뷰만으로는 전체 데이터를 커버할 수 없다.
그러면 이제 본격적으로 아이폰 유저들의 댓글을 어떻게 가져올지 생각해보자.
내가 찾아본 바로는 크게 두 가지 방법이 있을 수 있다.
첫 번째는 python의 selenium을 활용하여 앱스토어에 접속하여 온라인 행동 조작을 통해서 스크랩핑 을 하는 방법이 있을 수 있다.
이 방법을 본격적으로 진행해보진 않았지만 잠깐 개발자도구를 켜서 해보니 될 것 같기도하다.
다만, playstore와는 다르게 약간의 번거로움이 있다.
이 방법을 원하는 사람들은 전 포스팅들을 참고하면 될 듯하다.
하지만 나는 이번엔 다른 방법으로 리뷰를 가져오고자 한다.
두 번째는 바로 api 를 이용하는 것이다.
아래의 링크에 접속하면 해당 사이트에서 ios의 리뷰를 받아올 수 있는 API를 제공한다.
링크 : https://www.apptweak.io/
간단한 sign in을 하면 월 200번의 api request를 사용할 수 있다.
한 번에 최대 100개의 리뷰를 받는다 해도 한 달에 20000개의 리뷰 데이터를 받을 수 있다.
그렇다면 본격적으로 IOS의 앱 리뷰 데이터를 가져와보도록 하자!
1. Install and Setting cURL
Install
해당 사이트에서는 api를 cURL를 활용하여 기능을 제공한다.
cURL은 무엇일까?
< cURL은 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구를 제공하는 컴퓨터 소프트웨어 프로젝트이다. >
이라고 위키백과에 나와있다.
cURL은 다른 툴들과는 달리 cmd창에서 간단히 타이핑하기 때문에 별도의 UI가 없는 것이 특징이다.
아래의 주소에 접속하여 windows 64 bit 버전을 다운 받으면 된다.
https://curl.haxx.se/download.html
그런데 화면을 보면 알겠지만, 뭔가 종류가 엄청 많다.
cURL 종류
맨 아래 이런 문구가 있다.
“This colour means the packaged version is the latest stable version available (7.71.1)!”
번역하자면, 노란색 음영처리된 부분이 최신버전이라는 것이다.
저 많은 선택지 중에서 그냥 binary the curl project 를 선택하여 다운을 받으면 된다.
setting
다운로드 후 unzip을 하면 그림과 같은 화면이 나오는데 여기서 bin 폴더의 curl.exe 파일에 집중해보자.
download and unzip file
curl.exe 파일을 C:/경로 밑이나 C:/Program Files/ 경로 밑에 curl이라는 폴더를 새로 생성해서 파일을 옮겨주자.
우리는 curl.exe 파일을 이용하여 작업을 진행하고자하기 때문에 특정 path에 위치해 둔 것이다.
이쯤되면 어느정도 감이 온다.
환경변수 설정을 해줘야 언제든지 내가 원할 때마다 사용할 수 있다.
환경변수 세팅을 해보자.
환경변수 편집 창을 띄우자.
환경변수 설정
그림과 같이 curl.exe 파일이 존재하는 경로(아까 새로 만들었던 경로)를 “시스템 변수” 쪽에 새로 만들어준다.
그럼 이제 세팅까지 준비가 끝났다.
세팅이 잘 되었는지 확인해보려면 cmd창을 띄워서 아래의 코드를 실행시켜보자
curl –help
curl이라는 명령어를 못알아들으면 잘못 세팅한 것이고,
curl 명령어 리스트가 나오면 제대로 설치와 세팅이 된 것이다.
(참고: https://stackoverflow.com/questions/9507353/how-do-i-install-and-use-curl-on-windows)
그럼 이제 api를 사용해보도록 하자.
2. apptweak
API를 사용하기 위해 처음 해당 사이트를 방문했다면, 가입과 로그인이 필요하다. 가입도 간단하니 그냥 해보자.
로그인을 했다만 아래와 같은 화면이 보일 것이다.
로그인 화면
여기에서 API Document라는 부분을 클릭해보자.
API Document 접속화면
이번엔 IOS Docs를 클릭!
API 설정 화면
이제 내가 원하는 리뷰를 받기 위해서는 Reviews 항목을 선택하면 된다.
보면 그 하위 항목이 여러개가 나온다. 그 중 목적에 맞는 항목을 선택하면 된다.
나는 그 중 내가 원하는 기간동안의 데이터만 있으면 되므로 Filtered Reviews를 선택했다.
선택하고나면 아주 친절한 가이드 메뉴얼이 나온다.
어떻게 코드를 작성해야하는지, 어떤 내용을 받을 수 있는지 등 아주 바람직하게 나와있으니 참고하면 될 듯하다.
3. API
그럼 이제 준비가 되었으니 한 번 API를 이용해 리뷰데이터를 가져와보자.
curl -X GET -H “X-Apptweak-Key: ${API_KEY}” https://api.apptweak.com/ios/applications/686449807/reviews/filter/list.json?country=fr&min_rating=1&max_rating=5&start_date=2018-08-01&end_date=2018-09-30&term=bug&from=1&size=50
위의 코드는 사이트에서 제공하는 샘플 curl 코드이다.
자세히 살펴보면 몇가지 필요한 정보들이 있다.
첫 번째는 API_KEY이다.
이것은 사이트의 메인화면에서 밑의 사진처럼 token으로 주어진다.
두 번째는 APPLICATION_ID이다.
위의 코드 중 일부 “/ios/applications/686449807/reviews” 에서 application 다음에 일련의 숫자로 표시가 되어있는 부분이 APPLICATION_ID이다.
이 APPLICATION_ID는 그럼 어떻게 알 수 있을까?
나는 온라인상의 앱스토에서 라이프플러스 어플을 검색한 결과에서 찾을 수 있었다.
https://apps.apple.com/kr/app/lifeplus/id1037778235
이 링크가 라이프플러스의 앱스토어 링크인데 링크의 마지막 숫자 조합들이 APPLICATION_ID이다.
그럼 이제 필요한 정보들을 알았으니 조건을 부여하여 데이터를 가져와보도록 하자.
먼저, cmd창을 열고 각자 원하는 조건을 걸어 다음 코드를 완성시킨 뒤 실행시킨다.
curl -X GET -H “X-Apptweak-Key: ~(API KEY)~” https://api.apptweak.com/ios/applications/~(application_id)~/reviews.json?country=kr&language=kr
여기서 API KEY와 APPLICATION ID를 넣을 때, ~( )~까지 없애주고 순수 각 값만 넣어주면 된다.
그 결과는?!!!!
짜잔!!
결과…
글자들이 죄다 깨져잇다.. 분명 인코딩 문제일듯하다. 그래도 데이터는 잘 받아왔으리라 생각하며 이 결과를 txt파일로 내려받아 보았다.
curl -X GET -H “X-Apptweak-Key: ~(API KEY)~” \ https://api.apptweak.com/ios/applications/~(APPLICATION ID)~/reviews.json?country=kr\ > [your path]/review.txt
아까 위의 코드에서 꺽쇠(>) 후 원하는 저장경로에 파일이름까지만 적어주면, 해당 결과를 잘 떨궈준다.
텍스트 파일 결과
확인해보니 한글로 잘 인코딩되어있었다!!
이로써 리뷰를 받아오는 과정은 성공적으로 끝났다.
이제 이 리뷰들을 받아오는 방법을 알았으니 원하는만큼 리뷰를 받아오고 이쁘게 잘 만드는 과정을 공부해보자!!(이건 다음 시간에..ㅎㅎ)
728×90
반응형
키워드에 대한 정보 앱 크롤링
다음은 Bing에서 앱 크롤링 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 데이터수집? 크롤링 하는 방법 알려드릴게요! | 프로그래밍 팁
- 백엔드
- 스프링부트
- 코틀린
- Spring boot
- Kotlin
- 안드로이드
- 아이폰
- AOS
- IOS
- API
- 파싱
- Parsing
- 크롤링
데이터수집? #크롤링 #하는 #방법 #알려드릴게요! #| #프로그래밍 #팁
YouTube에서 앱 크롤링 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 데이터수집? 크롤링 하는 방법 알려드릴게요! | 프로그래밍 팁 | 앱 크롤링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.