5

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

以下是我的想法:

  1. 从一个(或多个)博客主页开始,收集该页面上的所有链接
  2. 删除所有内部链接(即如果我从 www.website.com 开始。那么我想从形状“www.website.com/***”中删除所有链接)。但存储所有外部链接。
  3. 转到每个链接(假设您尚未访问它们),然后重复步骤 1。
  4. 继续直到(假设)X 从第一页跳转。
  5. 绘制收集的数据。

我想为了在 R 中做到这一点,人们会使用 RCurl/XML(感谢 Shane 在这里的回答),结合类似igraph.

但是由于我没有使用其中任何一个的经验,如果我错过了任何重要的步骤,这里是否有人愿意纠正我,或者附上任何有用的代码片段来允许这项任务?

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

非常感谢!

塔尔

4

2 回答 2

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,我认为它会有意义。

不管怎样,祝朋友好运!托尼·布雷亚尔

于 2010-07-13T15:17:59.097 回答
4

塔尔,

这种类型的数据收集在网络理论中被称为k 雪球搜索,在 R 中应该相当简单。正如您所注意到的,完成此操作的最简单方法是使用XMl包和htmlTreeParse命令。这会将博客中的 HTML 解析为树,这将使您能够更轻松地执行您感兴趣的链接提取。

此外,igraph它可以完美地表示图形,而且还有一个有用的函数graph.compose用于获取两个图形并返回它们的边集组合。当您继续“滚雪球”时,您将需要它来组合数据。该过程的基本步骤是:

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

我在 R 中没有这方面的代码,但我使用 Google 的 SocialGraph API 生成了在 Python 中执行非常相似的过程的代码

祝你好运!

于 2010-07-11T20:19:09.743 回答