ほんじゃらねっと

ダイエット中プログラマのブログ

Groovy(もしくはJava)でログインの必要なサイトのWebスクレイピング

APIが存在しないWebサイトから情報を自動取得する方法として、Webスクレイピングを使う。

Jsoupというライブラリがシンプルで使いやすい。 取得したページの要素をjQuery風のセレクタを使って取得することができる。 http://jsoup.org/

通常のスクレイピングはサイトに掲載されているExampleの通りに 書いてすぐに実現できるのだけど、ログインしてからその情報を保持したまま サイト内の他のページにアクセスする方法がなかなか見つからなかったので、 サンプルを記載しておく。

ログイン時に発行されるCookieを取得し、それを他のページにアクセスする際に リクエストに含めることで実現することができた。

こちらのJavaコードを参考にGroovyで書いてみた。 JsoupでTwitterのタイムラインを取得してみる

サンプルスクリプト

@Grapes(
    @Grab(group='org.jsoup', module='jsoup', version='1.7.3')
)

import org.jsoup.*

def baseUrl = 'http://<テストURL>'
def loginUrl = baseUrl + '/<ログイン画面のURL>'
def mainUrl = baseUrl + '/<ログイン後に閲覧したいURL>'

//ログイン処理を実行し、発行されたクッキーを取得する
def cookies = Jsoup.connect(loginUrl)
.data('loginid', '<ログインID>')
.data('password', '<パスワード>')
.followRedirects(false)
.userAgent('Mozilla')
.method(Connection.Method.POST)
.execute()
.cookies()

//println(cookies)

//目的のページを開く際に取得したクッキーを設定する
def conn = Jsoup.connect(mainUrl).userAgent('Mozilla')
for (cookie in cookies) {
    conn.cookie(cookie.key, cookie.value)
}
mainDoc = conn.get()
//println mainDoc

//取得したHTMLを使って要素を取得したりできる
def newsTable = mainDoc.select('#news-table')
println newsTable

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Spidering hacks―ウェブ情報ラクラク取得テクニック101選