2010-07-11 55 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