2010-07-11 53 views
5

我想了解如何创建和可视化博客之间的链接地图,以反映它们之间的“社交网络”。使用R映射博客之间的链接网络?

这里是我正在考虑这样做的:

  1. 开始与一个(或多个)博客主页,并收集网页上的所有链接
  2. 删除所有的内部链接的链接(也就是说,如果我从www.website.com开始,那么我想删除形状为“www.website.com/***”的所有链接。但是存储所有的外部链接。
  3. 转到这些链接中的每一个(假设您还没有访问过它们),并重复步骤1.
  4. 继续直到(比方说)X从第一页跳转。
  5. 绘制收集的数据。

我想,为了R中做到这一点,一个会用RCurl/XML(感谢巴蒂尔的回答here),喜欢的东西的igraph结合。

但是既然我没有两人的经验,有没有人在这里可能愿意纠正我,如果我错过了任何重要的步骤,或附加任何有用的代码片段,以允许此任务?

ps:我对这个问题的动机是,我在一周内就useR 2010发表了一篇关于“博客和R”的演讲,并且我认为这可能是给观众带来乐趣的好方法,也是激励他们自己做这样的事情。

非常感谢!

塔尔

回答

7

注意:这个例子是一个非常基本的获取链接的方法,因此需要进行调整才能更健壮。 :)

我不知道这段代码有多有用,但希望它可以给你一个进入方向的想法(只需将它复制并粘贴到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 

如果您复制并粘贴到R,然后看X,我认为它会是有意义的。

无论哪种方式,祝你好运队友! Tony Breyal

4

塔尔,

这种类型的数据收集被称为K-雪球搜索网络理论,当你注意,最简单的方法应该是相当简单的R.要完成此操作将使用XMl程序包和htmlTreeParse命令。这将解析从博客的HTML到树,这将允许您更容易地执行您感兴趣的链接提取。

此外,igraph将完全能够表示图形,但也有一个有用的功能graph.compose获取两个图并返回它们的边集合成。当你继续“滚动雪球”时,你将需要这个来结合数据。该工艺的基本步骤是:

  1. 寻找一些种子博客
  2. 查找种子的所有邻国,并在连接到其邻国
  3. 中心的种子创建它的自我网(星图)
  4. 对于所有种子的邻居,创建自己的网络,并用它们的原始种子图形迭代地组合这些图。
  5. 重复您有兴趣收集的k个步骤。

我对此没有代码,但我有generated code that performs a very similar process in Python using Google's SocialGraph API

祝你好运!

+0

非常感谢德鲁,我会努力的(希望我能及时得到它)。 – 2010-07-12 06:21:57