전공 과제를 위해 플레이스토어의 리뷰를 저장해야 했다.
리뷰 통계 및 분석을 위해 많은 양의 리뷰가 필요했다.
빠른 작업을 위해 파이썬 크롤링을 알아보다, Chrome 개발자도구의 Console을 사용해 크롤링 하는 방법을 발견했다.
Chrome을 통해 데이터를 크롤링 한 후에는, Json 파일로 저장하고 Java로 다시 CSV로 변환했다.
크롤링부터 알아보자.
원문 출처 : https://zzsza.github.io/development/2019/03/12/crawling-in-developer-tools-console/
크롬 개발자 도구 Console에서 Google Play Review 크롤링하기
Crawling Google Play App Review with Developer Tools 개발자 도구를 사용해 Google Play App 리뷰 크롤링하는 과정에 대해 작성한 글입니다(정말 빠르고 쉽게 크롤링하기!) 부록으로 Word Cloud 그리는 Colab도 첨부했
zzsza.github.io
1. 크롬으로 플레이 스토어에 접속해 크롤링할 게임의 리뷰 모두 보기를 선택한다.
2. 리뷰를 많이 보기 위해 스크롤을 아래로 내린다.
개발자도구(F12) - Console에 코드를 입력하거나,
window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight);
또는, 스페이스 바를 눌러 밑으로 내린다.
4번 새로고침이 된 후에는 '더보기' 버튼이 생성된다. 누르고 다시 스크롤을 내린다.
3. 내용을 클립보드에 복사한다.
Console에 다음 코드를 입력한다.
var reviews = document.querySelectorAll('div[class="d15Mdf bAhLNe"]')
var data = []
reviews.forEach(v => data.push({body: v.outerHTML}))
이 코드는 모든 리뷰가 각각 갖고있는 HTML을 가져온다.
코드를 입력하고 Console에 data를 입력하면, data의 개수를 확인할 수 있다.
copy(data)를 입력하면 클립보드에 data가 저장된다.
copy(data)
다음은 클립보드에 복사한 리뷰들을 Json파일로 만들고, 다시 CSV 파일로 저장해보겠다.
1. 클립보드에 복사한 리뷰를 JSON 파일로 저장한다.
메모장을 열고 붙여넣기를 실행하면 리뷰들이 가진 HTML 내용이 모두 붙여넣어진다.
파일 - 다른 이름으로 저장을 선택 후 파일 이름은 'review.json', 파일 형식은 모든 파일로 저장한다.
다음과 같이 저장되었다.
2. Java로 파싱 및 CSV로 변환한다.
구글의 gson 라이브러리와 Apache Commons Lang 라이브러리를 사용했다.
https://mvnrepository.com/artifact/com.google.code.gson/gson
Maven Repository: com.google.code.gson » gson
mvnrepository.com
https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
Maven Repository: org.apache.commons » commons-lang3
Apache Commons Lang, a package of Java utility classes for the classes that are in java.lang's hierarchy, or are considered to be so standard as to justify existence in java.lang. VersionRepositoryUsagesDate3.10.x3.10Central742Mar, 20203.9.x3.9Central2,936
mvnrepository.com
1) JSON 파일을 파싱해 JsonArray 객체로 만든다.
JsonArray jsonArray = new JsonArray();
String filePath = "E:/Java/.idea/Resources/";
try {
FileReader fileReader = new FileReader(filePath + "review.json");
JsonParser parser = new JsonParser();
jsonArray = (JsonArray) parser.parse(fileReader);
} catch (Exception e) {
e.printStackTrace();
}
2) 반복문으로 Array를 돌며 이름과 리뷰 내용 등을 파싱한다.
JSON 형식이지만 이름과 리뷰 내용 등은 키 값이 따로 존재하지 않는 HTML 값이었다.
따라서 태그와 태그 사이의 String을 분리하기 위해 Apache 라이브러리의 subStringBetween() 메서드를 사용했다.
try {
FileOutputStream fos = new FileOutputStream(filePath + "review.csv");
OutputStreamWriter osw = new OutputStreamWriter(fos, "EUC-KR");
BufferedWriter bufferedWriter = new BufferedWriter(osw);
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject obj = (JsonObject) jsonArray.get(i);
String name = StringUtils.substringBetween(obj.get("body").toString(), "<span class=\\\"X43Kjb\\\">", "</span>");
String rating = StringUtils.substringBetween(obj.get("body").toString(), "별표 5개 만점에 ", "개를 받았습니다.");
String date = StringUtils.substringBetween(obj.get("body").toString(), "<span class=\\\"p2TkOb\\\">", "</span>");
String content = StringUtils.substringBetween(obj.get("body").toString(), "<span jsname=\\\"bN97Pc\\\">", "</span>");
bufferedWriter.write(name + "," + rating + "개," + date + "," + content);
bufferedWriter.newLine();
}
bufferedWriter.flush();
bufferedWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
실행 시 정상적으로 csv 파일이 작성된다.
소스는 깃허브에 업로드 했다.