はじめに
Web scraping とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術です。Web scraping は、Web上の非構造化データの変換、一般的には HTML フォーマットからデータベースやスプレッドシートに格納・分析可能な構造化データへの変換に焦点が当てられています。一方で、人間による WWW のブラウジングをシミュレートする Web crawler あるいは Web spider を含んだ広義の意味に捉えることもあります。Web crawler は、例えば、Googlebot(Google),Slurp(Yahoo),msnbot(Bing)などで、リンクを辿って新しいページを見つけます。その際、Crawler 用の情報を参照し、Sitemapの指定があれば、それを使ってサイト内を巡回します。今回はここまでの機能は実装せず、指定したサイト内の情報を取得するまでに留めました。
Web scraping してみる
▼サンプルスクリプト
# httpで情報をやりとりライブラリを読み込みます
library( RCurl )
# ワーキングディレクトリを指定します
setwd( "ワーキングディレクトリ" )
# 取得先URLを指定します
initSite <- "http://orablogs-jp.blogspot.jp/"
# 保存先ファイル名を指定します
initPage <- "get.html"
# ファイル読み込みモード
modeRead <- "r"
# (正規表現用)HTMLリンクタグ
href <- "<a href"
# (正規表現用)URLの先頭
http <- "^http"
# html拡張子
html <- ".html"
# ファイル名生成用関数
genKey <- function(){
paste( format( Sys.time(), "%Y%b%d%H%M%S" ), substr( paste( "0000000000" ,
round( abs( rnorm( 1 ) * 1000000000 )), sep = "" ),10, 20 ), sep = "" )
}
# サイトからPageを取得します
if( url.exists( initSite )){ download.file( initSite, destfile = initPage )}
pageBuf <- file( initPage, modeRead )
pageTxt <- as.list( readLines( pageBuf ))
close( pageBuf )
# href要素のリンク先URLを取得します
linkBuf <- strsplit( as.character( gsub( "\"", "'", pageTxt[ grep( href, pageTxt, perl = TRUE )])), "'" )
for (i in 1:length( linkBuf )) {
if ( i == 1 ) {
linkTxt <- linkBuf[[i]][grep( http, linkBuf[[i]], perl = TRUE )]
} else {
linkTxt <- c( linkTxt, linkBuf[[i]][grep( http, linkBuf[[i]], perl = TRUE )])
}
linkTxt <- unique( linkTxt )
}
# リンク先URLからPageを取得します
for (j in 1:length( linkTxt )) {
if( url.exists( initSite )){
download.file( linkTxt[[j]], destfile = paste( genKey(), html, sep = "" ))
}
}
備忘録
Web scraping を R でやる必要はなかったのですが、演習のつもりで取り組みました。試行の過程で、library(XML) の htmlParse を使ってみましたが、解析が遅いし文字化けが酷いので使用中止しました。
なお、サンプルコードは、私的使用のための複製(著作権法第30条)の基、という解釈です。取得した情報は、Web indexing(同第47条の6) や Web analysis(同第47条の7)に活用することになります。著作権法第47条の7の情報解析目的であっても、第47条の6の制約には注意を払う必要がありそうです。個人的にあるいは特定少数に提供するためにWeb indexingを開発するからといっても、以下の点に配慮したいです。
・文章、画像、音声、映像は、一部のみを収集
・robots.txt/robotsメタタグのアクセス制限を守る
・サーバアクセスの間隔を1秒以上空けるようにする。
・Pragma:No-cacheメタタグが設定されているページはダウンロードしない。
・rel=”nofollow”が設定されているリンクはクローラーで辿らない。
・ページに利用規約がある場合は守る。
・利用違反が発覚した場合は、取得した情報を破棄する。
・個人が特定されるデータは、公開しない。
ご参考
著作物が自由に使える場合
http://www.bunka.go.jp/seisaku/chosakuken/seidokaisetsu/gaiyo/chosakubutsu_jiyu.html
情報検索サービスに関する改正について
http://www.i-law.jp/paper/copyright-search.pdf