2010-07-11 13 views
5

Me gustaría obtener algún consejo sobre cómo crear y visualizar un mapa de enlaces entre los blogs para reflejar la "red social" entre ellos.¿Asignación de la red de enlaces entre blogs usando R?

Así es como pienso en hacerlo:

  1. empezar con uno (o más) la página principal del blog y recoger todos los enlaces de la página
  2. eliminar todos los enlaces que se encuentran los enlaces internos (es decir, si comienzo desde www.website.com. Entonces quiero eliminar todos los enlaces de la forma "www.website.com/***"). Pero almacena todos los enlaces externos.
  3. Vaya a cada uno de estos enlaces (suponiendo que no los haya visitado ya), y repita el paso 1.
  4. Continúe hasta (digamos) X salta desde la primera página.
  5. Grafica los datos recopilados.

me imagino que con el fin de hacer esto en I, se podría usar RCurl/XML (Gracias a Shane por su respuesta here), combinado con algo como igraph.

Pero dado que no tengo experiencia con ninguno de ellos, ¿hay alguien aquí que pueda estar dispuesto a corregirme si omitiera algún paso importante, o adjuntar algún fragmento de código útil para permitir esta tarea?

ps: Mi motivación para esta pregunta es que en una semana daré una charla sobre useR 2010 sobre "blogging y R", y pensé que esta podría ser una buena manera de dar algo divertido a la audiencia y también motívelos a hacer algo como esto ellos mismos.

¡Muchas gracias!

Tal

Respuesta

7

NB: Este ejemplo es una forma muy BÁSICA de obtener los enlaces y, por lo tanto, tendría que modificarse para ser más robusto. :)

No sé lo útil que es este código, pero espero que pueda darle una idea de la dirección a seguir (simplemente copie y pegue en R, es un ejemplo independiente una vez que haya instalado los paquetes RCurl y 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 

Si copia y pega en R, y luego mira en x, creo que va a tener sentido.

De cualquier manera, buena suerte amigo! Tony Breyal

4

Tal,

Este tipo de recolección de datos se conoce como una búsqueda k-bola de nieve en la teoría de redes, y debería ser bastante sencillo en R. Como usted señala, la forma más fácil para lograr esto usaría el paquete XMl y el comando htmlTreeParse. Esto analizará el HTML de un blog en un árbol, lo que le permitirá realizar más fácilmente la extracción del enlace que le interese.

Además, igraph sería perfectamente capaz de representar los gráficos, pero también tiene una función útil graph.compose para tomar dos gráficos y devolver su composición de conjunto de bordes. Necesitará esto para combinar datos mientras continúa "rodar la bola de nieve". Los pasos básicos del proceso serían:

  1. encontrar algún blog de semilla
  2. Buscar todos los vecinos de la semilla, y crear su (gráfico de la estrella) en el ego red con la semilla en el centro conectado a sus vecinos
  3. Para todos los vecinos de la semilla, cree sus redes ego, y componga iterativamente esos gráficos con su gráfico de semilla original.
  4. Repita para la mayor cantidad de pasos de k grados que esté interesado en recopilar.

No tengo ningún código para esto en R, pero tengo generated code that performs a very similar process in Python using Google's SocialGraph API.

¡Buena suerte!

+0

Muchas gracias Drew, voy a intentarlo (espero hacerlo a tiempo). –