library(RCurl)
library(dplyr)
library(rvest)
library(pforeach)
library(XML)
日本のRユーザーが発信するRの情報を集めたい。こつこつと資料へのリンクを追加しているが、それだけでは日本Rユーザーの補完ができるわけではない。というわけで次のターゲットとしてブログを選んだ。ブログは多くのRユーザーの情報源になっている。そのリンクを集めて、RSSをごにょごにょできないかと模索している。ひとまず今回はブログ名とRSSを取得するまで。
どこかにまとまってあるのかもしれないけど、探すのもアレだったので自分の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へのリンクは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"
こんな感じでdfのrss列に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("日々是独想 - 日々の徒然なることを独り想う。")
ブログタイトル、URL、RSSを含んだCSVファイルを作成する。RSSがあるので、そこからfeedをとってくることもできるけど、それはまた今度の宿題ということで。
df %<>% dplyr::select(title, url, rss)
kable(df, format = "html")
作成したCSVファイルはまたGitHubにあげておく。このようにすればURLだけでタイトルとRSSが得られるので少しは情報収集の時間が減らせるかもしれない。