Tal*_*ili 5 blogs r social-networking social-graph
我想知道如何创建和可视化博客之间的链接映射,以反映它们之间的"社交网络".
以下是我的想法:
我想,为了R中做到这一点,一个会用RCurl/XML(肖恩感谢你的回答在这里),喜欢的东西的igraph结合.
但由于我对这两个人都没有经验,如果我错过任何重要的步骤,或者附上任何有用的代码片段以允许此任务,是否有人愿意纠正我?
ps:我对这个问题的动机是,在一个星期内,我在"博客和R"上发表关于useR 2010的演讲,我认为这可能是一个很好的方式,既可以给观众一些乐趣,也可以激励他们做这样的事情本身.
非常感谢!
塔尔
注意:这个例子是获取链接的一种非常基本的方式,因此需要进行调整才能更加健壮.:)
我不知道这段代码有多么有用,但希望它可以让你知道进入的方向(只需将其复制并粘贴到R中,一旦你安装了包RCurl和XML,它就是一个自包含的例子) :
library(RCurl)
library(XML)
get.links.on.page <- function(u) {
doc <- getURL(u)
html <- htmlTreeParse(doc, useInternalNodes = TRUE)
nodes <- getNodeSet(html, "//html//body//a[@href]")
urls <- sapply(nodes, function(x) x <- xmlAttrs(x)[[1]])
urls <- sort(urls)
return(urls)
}
# a naieve way of doing it. Python has 'urlparse' which is suppose to be rather good at this
get.root.domain <- function(u) {
root <- unlist(strsplit(u, "/"))[3]
return(root)
}
# a naieve method to filter out duplicated, invalid and self-referecing urls.
filter.links <- function(seed, urls) {
urls <- unique(urls)
urls <- urls[which(substr(urls, start = 1, stop = 1) == "h")]
urls <- urls[grep("http", urls, fixed = TRUE)]
seed.root <- get.root.domain(seed)
urls <- urls[-grep(seed.root, urls, fixed = TRUE)]
return(urls)
}
# pass each url to this function
main.fn <- function(seed) {
raw.urls <- get.links.on.page(seed)
filtered.urls <- filter.links(seed, raw.urls)
return(filtered.urls)
}
### example ###
seed <- "http://www.r-bloggers.com/blogs-list/"
urls <- main.fn(seed)
# crawl first 3 links and get urls for each, put in a list
x <- lapply(as.list(urls[1:3]), main.fn)
names(x) <- urls[1:3]
x
Run Code Online (Sandbox Code Playgroud)
如果你将它复制并粘贴到R中,然后看看x,我认为这是有道理的.
无论哪种方式,祝你好运伴侣!Tony Breyal