본문 바로가기
코드리뷰/코틀린 리뷰

안드로이드앱 QR/BAR CODE 정보 크롤링 하기(코틀린)

by 디마드 2020. 12. 6.

안드로이드 앱에서 웹 사이트 정보를 가져와 사용할 수 있다. 크롤링 또는 스크레이핑이라고 부른다. 회사에서 약 5년 정도 전에 스크레이핑을 이용해 금융정보를 가져오고 이체까지 수행하는 솔루션을 보고 신기하게 생각을 했었는데, 지금은 일반적인 기술 중 하나가 된 것 같다. 파이썬이라는 프로그램 언어의 영향이 크다. 

코틀린을 통해 간단하게 크롤링을 구현해 보자.

 

크롤링 결과 보기

상품 크롤링

 

[작업 순서]

  1. 리더기를 통해 바코드를 읽어온다.

  2. koreannet 사이트에서 바코드를 입력하고 상품정보를 찾는다.

  3. 결과를 리턴한다.

 

크롤링 코드

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("&nbsp;").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
                }
            }
        }
    }

 

반응형

댓글