17
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

R言語 - Web scraping

Last updated at Posted at 2015-12-24

はじめに

 Web scraping とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術です。Web scraping は、Web上の非構造化データの変換、一般的には HTML フォーマットからデータベースやスプレッドシートに格納・分析可能な構造化データへの変換に焦点が当てられています。一方で、人間による WWW のブラウジングをシミュレートする Web crawler あるいは Web spider を含んだ広義の意味に捉えることもあります。Web crawler は、例えば、Googlebot(Google),Slurp(Yahoo),msnbot(Bing)などで、リンクを辿って新しいページを見つけます。その際、Crawler 用の情報を参照し、Sitemapの指定があれば、それを使ってサイト内を巡回します。今回はここまでの機能は実装せず、指定したサイト内の情報を取得するまでに留めました。

Web scraping してみる

▼サンプルスクリプト

R
# 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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?