LoginSignup
17
22

More than 3 years have passed since last update.

Jsoupでスクレイピング

Last updated at Posted at 2018-04-07

要件

  • webから直接情報を取得する(api等は用意しない)

Jsoupとは

https://github.com/jhy/jsoup
htmlを取得してjQueryっぽく要素にアクセスできるライブラリです。サイト上のhtmlまるごと取得するので自前APIに比べ決して早くは無いですが、簡単なアプリでwebから情報を取得する場合はこれで十分だなと思いました。

URLからHTMLを取得する


val document = Jsoup.connect("サイトのURL").get()

取得したHTMLから要素を指定する

色々APIはありますが、.selectで大概のことが出来ます。※list形式で取得されるので使用する際はindexを指定する必要があります

タグ指定の場合

document.select("タグ名").first().text()

ID指定の場合

document.select("#ID名").first().text()

クラス指定の場合

document.select(".クラス名").first().text()

属性の値を取得したい場合


document.select("タグ名").first().attr("abs:属性名").`val`()

サンプルコード

Qiitaのトップページから、最初の記事のURLを取得してみたいと思います。


data class QiitaItem(
        var url: String
) {
    companion object {
        fun getUrl(): Single<QiitaItem> {
            return Single.create<Document> {
                val document = Jsoup.connect("https://qiita.com/trend").get()
                it.onSuccess(document)
            }.flatMap {
                val cell = it.select(".p-home_main .tr-ItemList .tr-Item").first()
                val url = cell.select("tr-Item_title").first().attr("abs:href")
                Single.just(QiitaItem(url))

            }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
        }
    }

}


QiitaItem.getUrl().subscribe(object : DisposableSingleObserver<QiitaItem>() {
            override fun onSuccess(data: QiitaItem) {
                Log.d("url", data.url)
            }

            override fun onError(e: Throwable) {
                Log.e("error", e.toString())
            }
        })
17
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
22