kotlin crawling으로

13103 단어 Kotlincrawler
태권도 Advent Calendar 2017의 9일째 보도.
그럼 며칠 전 보도에서 간단하게 kotlin을 수행할 수 있기 때문에 조금 실용적인 것으로 Crawler를 만들고 싶습니다.
기능으로 지정된 URL의 HTML 내 이미지 목록만 표시합니다.
이번에는 Java 라이브러리 crawler4j의 kotlin 버전 kotlin-crawler 을 사용합니다.

1. build.gradle 수정


우선,kotlin-crawler의 README를 참고하여 지난번에 제작한build.gradle을 편집합니다.
Repositories와 dependencies 부분을 수정했습니다.
build.gradle
buildscript {
  ext.kotlin_version = '1.2.0'
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

apply plugin: 'kotlin'
apply plugin: 'application'

repositories {
  jcenter()
  mavenCentral()
  maven { url "https://jitpack.io" }
}

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  compile 'com.github.brianmadden:krawler:0.4.3'
}

sourceSets {
  main.java.srcDirs += './'
}

defaultTasks 'run'

run {
  if (project.hasProperty('main')) {
    main(project.main.replace(".kt", "Kt").capitalize())
  }
}

3. 프로그램 작성


이번에 우리는kotlin-crawler의 샘플 프로그램을 우리 회사 HP에서 이미지 파일을 얻은 목록으로 수정합니다.
※ 과도한 접근은 대상 서버에 부담을 줄 수 있으므로 실행 시 주의하세요!
main.kt
import io.thelandscape.krawler.crawler.KrawlConfig

fun main(args: Array<String>)
{
    // totalPagesにCrawlするページ数を設定する
    // あまり多すぎるとサーバに負荷をかけてしまうのでほどほどに・・・
    val config: KrawlConfig = KrawlConfig(totalPages = 100)
    val k = SimpleExample(config)

    // アクセスを許可するホストの一覧
    val allowedHosts = listOf("tecotec.co.jp")
    k.whitelist.addAll(allowedHosts)

    // Crawl先を指定して実行
    k.start(listOf("http://tecotec.co.jp/"))
}
SimpleExample.kt
import io.thelandscape.krawler.crawler.KrawlConfig
import io.thelandscape.krawler.crawler.Krawler
import io.thelandscape.krawler.http.KrawlDocument
import io.thelandscape.krawler.http.KrawlUrl
import java.time.LocalTime
import java.util.concurrent.ConcurrentSkipListSet
import java.util.concurrent.atomic.AtomicInteger

class SimpleExample(config: KrawlConfig = KrawlConfig()) : Krawler(config)
{
    // 抽出から除外するURLの正規表現
    private val EXCLUDE_FILTERS: Regex = Regex(".*(\\.(css|js|bmp|gif|jpe?g|png|tiff?|mid|mp2|mp3|mp4|wav|avi|" +
            "mov|mpeg|ram|m4v|pdf|rm|smil|wmv|swf|wma|zip|rar|gz|tar|ico))$", RegexOption.IGNORE_CASE)

    // ドキュメントから抽出する拡張子の正規表現
    private val EXTRACT_FILTERS: Regex = Regex(".*(\\.(bmp|gif|jpe?g|png|tiff?))$", RegexOption.IGNORE_CASE)

    val whitelist: MutableSet<String> = ConcurrentSkipListSet()

    // Crawlする対象URLかどうかを判定するメソッド
    // この中の条件を変えて対象URLを絞り込む
    override fun shouldVisit(url: KrawlUrl): Boolean {
        val getParams: String = url.canonicalForm.split("?").first()
        return (!EXCLUDE_FILTERS.matches(getParams) && url.host in whitelist)
    }

    private val counter: AtomicInteger = AtomicInteger(0)

    // 抽出対象を処理するメソッド
    // この中で抽出対象のドキュメントについて操作を行う
    override fun visit(url: KrawlUrl, doc: KrawlDocument) {
        println("${counter.incrementAndGet()}. Crawling ${url.canonicalForm}")
        doc.otherOutgoingLinks.forEach {
            if (EXTRACT_FILTERS.matches(it)) {
                println(it)
            }
        }
    }

    override fun onContentFetchError(url: KrawlUrl, reason: String) {
        println("Tried to crawl ${url.canonicalForm} but failed to read the content.")
    }

    private var startTimestamp: Long = 0
    private var endTimestamp: Long = 0

    override fun onCrawlStart() {
        startTimestamp = LocalTime.now().toNanoOfDay()
    }
    override fun onCrawlEnd() {
        endTimestamp = LocalTime.now().toNanoOfDay()
        println("Crawled $counter pages in ${(endTimestamp - startTimestamp) / 1000000000.0} seconds.")
    }
}

4. 실행


이전과 마찬가지로 [도구] > [구축]을 선택하거나 Ctrl+B에서 구축을 실행합니다.

이렇게 하면 kotlin과 편안한 크롤링 생활을 할 수 있습니다!
여러분도 천천히 Kotlin이랑 놀아요!

좋은 웹페이지 즐겨찾기