안드로이드 앱에서 웹 사이트 정보를 가져와 사용할 수 있다. 크롤링 또는 스크레이핑이라고 부른다. 회사에서 약 5년 정도 전에 스크레이핑을 이용해 금융정보를 가져오고 이체까지 수행하는 솔루션을 보고 신기하게 생각을 했었는데, 지금은 일반적인 기술 중 하나가 된 것 같다. 파이썬이라는 프로그램 언어의 영향이 크다.
코틀린을 통해 간단하게 크롤링을 구현해 보자.
크롤링 결과 보기
[작업 순서]
-
리더기를 통해 바코드를 읽어온다.
-
koreannet 사이트에서 바코드를 입력하고 상품정보를 찾는다.
-
결과를 리턴한다.
크롤링 코드
build.gradle에 라이브러리 추가 + Sync
dependencies {
...
// jsoup 추가 (크롤링)
implementation 'org.jsoup:jsoup:1.13.1'
//
}
코리안넷에 바코드를 인자로 넘겨 검색하고 그 결과를 Jsoup을 이용해 받아온다. 불필요한 html코드와 css tag는 제거하고 textView에 저장한다. 해당 바코드가 없을 경우도 있으니 예외 처리도 해줘야 한다.
일반적으로 크롤링을 할 때는 쓰레드 처리를 해야 하는데, 코틀린에서는 Coroutine을 이용해 간단하게 처리가 가능한다.
// 상품정보 크롤링 호출
setProductInfo(result.contents)
// 상품정보 크롤링
private fun setProductInfo(code: String) {
suspend fun getResultFromApi(): String {
// do something
val url = "http://www.koreannet.or.kr/home/hpisSrchGtin.gs1?gtin=${code}"
val doc = Jsoup.connect(url).timeout(1000 * 10).get() //타임아웃 10초
val contentData : Elements = doc.select("div.productTit")
val productName = contentData.toString().substringAfterLast(" ").substringBefore("</div>")
var rtnValue : String = ""
if ( productName.toString().trim() !="" ) {
rtnValue = productName.toString().trim()
}
else {
rtnValue = errMsg //"유통물류 DB에 등록되지 않은 코드입니다."
}
return rtnValue
}
CoroutineScope(IO).launch {
val resultStr = withTimeoutOrNull(10000) {
getResultFromApi()
}
if (resultStr != null) {
withContext(Main) {
txtProductName.text = resultStr
}
}
}
}
반응형
'코드리뷰 > 코틀린 리뷰' 카테고리의 다른 글
안드로이드앱 동적 버튼 만들기 (코틀린) (3) | 2020.12.07 |
---|---|
안드로이드 앱 리뷰/별점 주기 기능 (rating) (0) | 2020.10.24 |
안드로이드 앱 SNS 공유, 무료 아이콘 받기 (0) | 2020.10.24 |
댓글