이 튜토리얼에서는 Kotlin을 사용하여 안드로이드 애플리케이션에서 웹 스크래핑(Web Scraping)을 수행하는 방법을 단계별로 살펴봅니다. 웹 스크래핑은 웹페이지에서 필요한 데이터를 자동으로 추출하는 기술로, 이 예제에서는 Java/Kotlin 환경에서 가장 널리 쓰이는 HTML 파싱 라이브러리인 Jsoup을 활용합니다.
1단계: 새 프로젝트 생성
Android Studio를 실행한 후 File → New Project 메뉴로 이동하고, 새 프로젝트 생성에 필요한 모든 정보를 입력하여 프로젝트를 만듭니다.
2단계: Jsoup 라이브러리 추가
웹 스크래핑을 위해서는 Jsoup 의존성을 먼저 추가해야 합니다. 앱 수준의 build.gradle 파일에 아래 코드를 추가한 뒤 프로젝트를 동기화(Sync Now)하세요.
dependencies {
implementation 'org.jsoup:jsoup:1.15.3'
}3단계: 레이아웃 작성
res/layout/activity_main.xml 파일에 다음 코드를 추가합니다. 화면 상단에는 스크래핑한 텍스트를 출력할 TextView, 하단에는 스크래핑을 시작하는 Button이 배치됩니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="4dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/btnView"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp"
android:padding="4dp"
android:text="" />
<Button
android:id="@+id/btnView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="25sp"
android:text="Scrap Text from web" />
</RelativeLayout>
4단계: MainActivity 작성
src/MainActivity.kt 파일에 다음 코드를 추가합니다. 버튼을 클릭하면 내부 클래스로 정의된 WebScratch(AsyncTask)가 백그라운드 스레드에서 Jsoup으로 해당 웹페이지에 접속해 전체 텍스트를 추출하고, 작업이 끝나면 결과를 TextView에 표시합니다.
import android.os.AsyncTask
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.jsoup.Jsoup
import java.io.IOException
@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {
private lateinit var textView: TextView
lateinit var button: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
textView = findViewById(R.id.textView)
button = findViewById(R.id.btnView)
button.setOnClickListener {
WebScratch().execute()
}
}
inner class WebScratch : AsyncTask<Void, Void, Void>() {
private lateinit var words: String
override fun doInBackground(vararg params: Void): Void? {
try {
val document = Jsoup.connect("https://www.tutorialspoint.com/css_online_training/index.asp").get()
words = document.text()
} catch (e: IOException) {
e.printStackTrace()
}
return null
}
override fun onPostExecute(aVoid: Void?) {
super.onPostExecute(aVoid)
textView.text = words
}
}
}
참고: AsyncTask는 현재 공식적으로 지원 중단(deprecated)된 API입니다. 실제 서비스용 앱에서는 Kotlin 코루틴(Coroutines)이나 WorkManager 같은 최신 비동기 처리 방식을 사용하는 것이 좋습니다.
5단계: 인터넷 권한 설정
네트워크 통신이 필요하므로 androidManifest.xml에 반드시 INTERNET 권한을 선언해야 합니다. 다음 코드를 추가하세요.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.q11">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run(실행) 아이콘
을 클릭하세요. 실행 옵션 목록에서 본인의 모바일 기기를 선택하면, 기본 화면이 표시됩니다.
버튼을 누르면 지정한 웹페이지의 텍스트가 추출되어 화면에 나타납니다.
