使用R在博客之间映射链接网络?

时间:2010-07-11 19:43:09

标签: r blogs social-networking social-graph

我想知道如何在博客之间创建和可视化链接地图,以反映它们之间的“社交网络”。

以下是我在考虑这样做的方法:

  1. 从一个(或多个)博客主页开始,收集该页面上的所有链接
  2. 删除所有内部链接的链接(即,如果我从www.website.com开始。然后我想删除形状“www.website.com/***”中的所有链接)。但是存储所有外部链接。
  3. 转到每个链接(假设您尚未访问过它们),并重复步骤1.
  4. 继续直到(让我们说)X从第一页跳转。
  5. 绘制收集的数据。
  6. 我想,为了在R中执行此操作,可以使用RCurl / XML(感谢Shane为您的答案here),并结合类似igraph的内容。

    但由于我对这两种情况都没有经验,如果我错过任何重要步骤,或者附上任何有用的代码片段以允许此任务,是否有人愿意纠正我?

    ps:我对这个问题的动机是,在一周之内,我将在“博客和R”上发表关于useR 2010的演讲,我认为这可能是一个很好的方式,既可以为观众带来乐趣,也可以激励他们自己做这样的事情。

    非常感谢!

    塔尔

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

塔尔,

这种类型的数据收集在网络理论中被称为 k-snowball搜索,在R中应该相当简单。正如您所指出的,实现这一目标的最简单方法是使用XMl包和htmlTreeParse命令。这会将HTML从博客解析为树,这样您就可以更轻松地执行您感兴趣的链接提取。

此外,igraph完全能够表示图形,但也有一个有用的函数graph.compose用于获取两个图形并返回它们的边集集合。你需要这个来组合数据,因为你继续“滚雪球”。该过程的基本步骤是:

  1. 查找种子博客
  2. 查找种子的所有邻居,并创建其自我网(星图),其中心的种子与其邻居相连
  3. 对于所有种子的邻居,创建他们的自我网,并用原始种子图迭代地组合这些图。
  4. 重复您有兴趣收集的多个k度步骤。
  5. 我在R中没有这个代码,但我有generated code that performs a very similar process in Python using Google's SocialGraph API

    祝你好运!