library(RCurl)
library(dplyr)
library(rvest)
library(pforeach)
library(XML)

日本のRユーザーが発信するRの情報を集めたい。こつこつと資料へのリンクを追加しているが、それだけでは日本Rユーザーの補完ができるわけではない。というわけで次のターゲットとしてブログを選んだ。ブログは多くのRユーザーの情報源になっている。そのリンクを集めて、RSSをごにょごにょできないかと模索している。ひとまず今回はブログ名とRSSを取得するまで。

ブログURLをまとめる(手動)

どこかにまとまってあるのかもしれないけど、探すのもアレだったので自分のFeedlyに登録されている・ぱっと思いついたブログのURLを収集してCSVファイルを作った。ファイルはGitHubにあるので、「うちのブログがないやんけ!」という場合にはぜひ追加修正していただきたい。

df <- getURL("https://raw.githubusercontent.com/uribo/Japan.useR/master/inst/assets/raw_data/JapanRBlog.csv") %>% 
  read.csv(text = ., header = TRUE)

ひとまず45件分ある。

RSSを取得する

RSSへのリンクはhtmlの<head><link> ... </link></head>にあることが多いので、そこからRSSっぽいものを取得するだけ。このへんの処理もまた赤ペン先生の手直しが入るかもしれない…。

npforeach(id = df$url)({
  id %>% paste(.) %>% html() %>% html_nodes(., "head link") %>% {
    res0 <<- .
    res <<- html_attr(., "type")
    res2 <<- res %>% grep("rss", x = ., value = FALSE)
  }
  res0[res2[1]] %>% html_attr("href")
}) -> df$rss
df$rss[1:2]
## [1] "http://aaaazzzz036.hatenablog.com/rss"
## [2] "http://akiniwa.hatenablog.jp/rss"

こんな感じでdfrss列にRSSへのリンクを格納した。

ブログ名をとってくる

せっかくRSSのリンクを取得したので、その情報からブログ名もとってくる。なお、1件だけRSSフィードの取得に失敗したのでそちらも手動で対処。

df2 <- df[1:44, ] %>% na.omit() %>% droplevels() # エラーになる項目をとりのぞいたデータフレームを一時的に使用
npforeach(id = df2$rss)({
  xmlParse(id) %>% xmlToList() %$% channel$title
}) -> df2$title

取得できなかったブログ

df %<>% left_join(., df2)
## Joining by: c("url", "rss")
## Warning: joining factors with different levels, coercing to character
## vector
df$rss %>% is.na() %>% which()
## [1] 3 5
df$url[3] # http://blog.gepuro.net; げぷろくん
df$url[5] # http://blog.kz-md.net; ぞうさん

上記のサイトは<head>にRSSへのリンクを貼っていないみたいなので手動でとってくる。ぞうさんのところはRSSそのものがないっぽい(リンク切れ??)ので諦めた。

df$rss[3] <- c("http://blog.gepuro.net/recent.atom")
xmlParse(df$rss[45]) %>% xmlToList() %$% channel$title
# Error: XML content does not seem to be XML: 'https://kohske.wordpress.com/feed/'
df$title[45] <- c("Hi!!")
df$title[3] <- c("gepulog")
df$title[5] <- c("日々是独想 - 日々の徒然なることを独り想う。")

CSVファイルとして保存

ブログタイトル、URL、RSSを含んだCSVファイルを作成する。RSSがあるので、そこからfeedをとってくることもできるけど、それはまた今度の宿題ということで。

df %<>% dplyr::select(title, url, rss)
kable(df, format = "html")
title url rss
サボタージュ禁止のおさぼり日記 http://aaaazzzz036.hatenablog.com http://aaaazzzz036.hatenablog.com/rss
忘れないようにメモっとく http://akiniwa.hatenablog.jp http://akiniwa.hatenablog.jp/rss
gepulog http://blog.gepuro.net http://blog.gepuro.net/recent.atom
裏 RjpWiki http://blog.goo.ne.jp/r-de-r http://blog.goo.ne.jp/r-de-r/rss2.xml
日々是独想 - 日々の徒然なることを独り想う。 http://blog.kz-md.net NA
捨てられたブログ http://blog.recyclebin.jp http://blog.recyclebin.jp/feed
タイトルって難しい。 http://can.hatenadiary.com http://can.hatenadiary.com/rss
あらびき日記 http://d.hatena.ne.jp/a_bicky/ http://d.hatena.ne.jp/a_bicky/rss
arupaka-_-arupakaの日記 http://d.hatena.ne.jp/arupaka-_-arupaka/ http://d.hatena.ne.jp/arupaka-_-arupaka/rss
盆栽日記 http://d.hatena.ne.jp/dichika/ http://d.hatena.ne.jp/dichika/rss
ほくそ笑む http://d.hatena.ne.jp/hoxo_m/ http://d.hatena.ne.jp/hoxo_m/rss
檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/ http://d.hatena.ne.jp/m-hiyama/rss
驚異のアニヲタ社会復帰への道 http://d.hatena.ne.jp/MikuHatsune/ http://d.hatena.ne.jp/MikuHatsune/rss
糞ネット弁慶 http://d.hatena.ne.jp/repose/ http://d.hatena.ne.jp/repose/rss
もうカツ丼でいいよな http://d.hatena.ne.jp/Rion778/ http://d.hatena.ne.jp/Rion778/rss
ryamadaの遺伝学・遺伝統計学メモ http://d.hatena.ne.jp/ryamada22/ http://d.hatena.ne.jp/ryamada22/rss
My Life as a Mock Quant http://d.hatena.ne.jp/teramonagi/ http://d.hatena.ne.jp/teramonagi/rss
どんな鳥も http://d.hatena.ne.jp/tsutatsutatsuta/ http://d.hatena.ne.jp/tsutatsutatsuta/rss
yokkunsの日記 http://d.hatena.ne.jp/yokkuns/ http://d.hatena.ne.jp/yokkuns/rss
秩序と情報とブロッコリー http://data-hacker.blogspot.jp http://data-hacker.blogspot.com/feeds/posts/default?alt=rss
@DataSci http://datasci.jp http://datasci.jp/?feed=rss2
でたぁっ 感動と失敗の備忘録 http://deta.hateblo.jp http://deta.hateblo.jp/rss
INPUTしたらOUTPUT! http://estrellita.hatenablog.com http://estrellita.hatenablog.com/rss
なんとなくな Developer のメモ http://fits.hatenablog.com http://fits.hatenablog.com/rss
からあげ定食 http://fujit33.hatenablog.com http://fujit33.hatenablog.com/rss
300億円欲しい http://gg-hogehoge.hatenablog.com http://gg-hogehoge.hatenablog.com/rss
Golden State http://goldenstate.cocolog-nifty.com/blog/ http://goldenstate.cocolog-nifty.com/blog/index.rdf
Small Data Scientist Memorandum http://heartruptcy.blog.fc2.com http://heartruptcy.blog.fc2.com/?xml
Taglibro de H http://ito-hi.blog.so-net.ne.jp http://ito-hi.blog.so-net.ne.jp/index.rdf
J’s blog http://jundoll.hatenablog.com http://jundoll.hatenablog.com/rss
働いたら負け http://kenchan0130-aki.hatenablog.com http://kenchan0130-aki.hatenablog.com/rss
Dimension Planet Adventure 最終章 最終話『栄光なる未来』 http://ksmzn.hatenablog.com http://ksmzn.hatenablog.com/rss
langstat blog http://langstat.hatenablog.com http://langstat.hatenablog.com/rss
Muni Bus http://munibus.hatenablog.com http://munibus.hatenablog.com/rss
random dispersal http://nhkuma.blogspot.jp http://nhkuma.blogspot.com/feeds/posts/default?alt=rss
Technically, technophobic. http://notchained.hatenablog.com http://notchained.hatenablog.com/rss
Panda Analysis http://panda-nikki.hatenablog.jp http://panda-nikki.hatenablog.jp/rss
Practice makes perfect http://pracmper.blogspot.jp http://pracmper.blogspot.com/feeds/posts/default?alt=rss
ぷる日記 http://prunus1350.hatenablog.com http://prunus1350.hatenablog.com/rss
StatsFragments http://sinhrks.hatenablog.com http://sinhrks.hatenablog.com/rss
どらちゃんのポッケ http://sleeping-micchi.hatenablog.com http://sleeping-micchi.hatenablog.com/rss
Rプログラミングの小ネタ http://tips-r.blogspot.jp http://tips-r.blogspot.com/feeds/posts/default?alt=rss
singular point http://www.singularpoint.org/blog/ http://www.singularpoint.org/blog/feed/
xfujimonのブログ http://xfujimon.hatenablog.com http://xfujimon.hatenablog.com/rss
Hi!! https://kohske.wordpress.com https://kohske.wordpress.com/feed/

  作成したCSVファイルはまたGitHubにあげておく。このようにすればURLだけでタイトルとRSSが得られるので少しは情報収集の時間が減らせるかもしれない。