2014/09/09
このブログについて
 >  全記事リストを R で作成
ブログトップページの What's New を次々にたどって、全記事の日付・カテゴリ・標題・リンクを HTML に出力した。↓ がその結果。ブログ設定を調べれば同様のページを作れるかもしれないが、この方が早そうだったので。R の実行環境は 2014/08/13 の実機を参照。

https://kenpg.up.seesaa.net/image/20140909_article_lists.html


HTML から正規表現でリンクを抽出した。↓ にある例が分かりやすくて参考になった。ただ、今日調べた範囲では R では複数マッチ(一つながりの HTML から複数のリンクを抽出するなど)ができないらしく、苦労した。

■ バイオスタティスティクス : Rプログラミング > 正規表現, 文字列
http://stat.biopapyrus.net/r/regex.html
http://stat.biopapyrus.net/r/string.html

↓ 作成したスクリプト。What's New のページから記事のリストをベクトルに入れ、次の What's New へのリンクを抽出して関数を再帰呼び出しする。最後に記事リストのベクトルを連結し、先頭に若干のヘッダを入れて HTML ファイルに出力する。
rm(list=ls())
top = 'http://kenpg.seesaa.net/'
fln = '20140909_article_lists.html'
main = function(){
message('Start ', Sys.time())
tag = fn1(top, NULL)
tag = gsub(' style=".+?"', '', tag)
tag = gsub('<ul>', '', tag)
len = length(tag)
htm = paste(collapse='\n', tag)
htm = paste(sep='', '<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<style><!--
a { color:blue; text-decoration:none }
li { line-height:1.3 }
--></style></head>', '<body><ol>', htm, '</ol></body></html>')
write(x=htm, file=fln)
message(len, ' urls -> ', fln)
message('End ', Sys.time())
}

fn1 = function(url, tag){
con = url(url, encoding='sjis')
htm = paste(collapse='', gsub('\\t', '', readLines(con)))
close(con)

rg1 = sub('^.+?<ul', '<ul', htm)
rg1 = grep('^<ul', unlist(strsplit(rg1, '</ul>')), value=T)
tag = c(tag, rg1)
message(url, ' nchar=', nchar(htm), ' urls=', length(rg1))
Sys.sleep(1)

rg2 = regexpr('http://kenpg.seesaa.net/index-[0-9]+.html">&gt;&gt;', htm)
if(rg2 == -1){
message('No Nextpage')
return(tag)
} else {
url = substr(htm, rg2, rg2
+ attr(rg2, 'match.length')
- nchar('">&gt;&gt;') - 1)
tag = fn1(url, tag)
}
}

main()

スクリプトを R のコンソールで実行してもいいが、一昨日のバッチファイル ↓ を試した。

■ R 起動バッチファイル(スクリプトファイル名.bat として、同じ所に置く)
@ECHO OFF
"C:/Program Files/R/R-2.15.3/bin/i386/Rscript.exe" --slave -e "while(1){
source(paste(sep='/', getwd(), '%~n0'));
con=file('stdin'); message('Enter : Redo\nOthers : End');
inp=scan(con, nlines=1, quiet=T, what=character()); close(con);
if(length(inp) > 0) break }"
REM ↑ 実際は "C:/... から一行
ECHO R quit. Press any key to close.
PAUSE > NUL

適当なファイル名を付けて同じ場所に二ファイルを置き ↓ バッチをダブルクリックすると DOS 窓でスクリプトが実行される。What's New のページは全部で41あり、一秒おきに HTML を取得すると1分未満で終わる。



正常終了すれば ↓ のように同じ場所に HTML ができる。リンクが絶対アドレスなので、ローカルで開いても使える。これをそのままファイル置き場に UP したのが、冒頭のリンク。
<< VBS 試行錯誤用バッチファイル
Seesaa で画像 UP が便利に >>