kotlin crawling으로
그럼 며칠 전 보도에서 간단하게 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.ktimport 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이랑 놀아요!
Reference
이 문제에 관하여(kotlin crawling으로), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/teco_iida/items/c9fe3c62121b92a445bc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)