2010-07-11 8 views
5

Vorrei qualche consiglio su come creare e visualizzare una mappa dei collegamenti tra i blog in modo da riflettere il "social network" tra loro.Mappare la rete di collegamento tra blog usando R?

Ecco come sto pensando di farlo:

  1. Inizia con uno (o più) blog home page e raccogliere tutti i link a quella pagina
  2. rimuovere tutti i link che sono link interni (Cioè, se parto da www.website.com, allora voglio rimuovere tutti i link dalla forma "www.website.com/***"). Ma conserva tutti i link esterni.
  3. Andare a ciascuno di questi collegamenti (supponendo che non li abbia già visitati) e ripetere il passaggio 1.
  4. Continuare fino a quando (diciamo) X salta dalla prima pagina.
  5. Tracciare i dati raccolti.

immagino che per fare questo in R, si potrebbe usare RCurl/XML (Grazie per la risposta Shane here), in combinazione con qualcosa come IGRAPH.

Ma dal momento che non ho esperienza con nessuno di loro, c'è qualcuno qui che potrebbe essere disposto a correggermi se ho saltato qualche passaggio importante, o allego qualche utile snippet di codice per consentire questo compito?

ps: La mia motivazione per questa domanda è che in una settimana mi sto dando una conferenza su 2010 dell'utente su "blogging e R", e ho pensato che questo potrebbe essere un bel modo per entrambi dare qualcosa di divertente per il pubblico e anche motivarli a fare qualcosa di simile loro stessi

Grazie mille!

Tal

risposta

7

NB: questo esempio è un modo molto BASIC per ottenere i collegamenti e, pertanto, dovrebbe essere modificato per essere più robusto. :)

Non so quanto sia utile questo codice, ma si spera che possa darti un'idea della direzione da seguire (basta copiarlo e incollarlo in R, è un esempio autonomo una volta installato i pacchetti RCurl e 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 

Se si copia e si incolla in R, e poi guardi x, penso che sarà un senso.

In entrambi i casi, buona fortuna amico! Tony Breyal

4

Tal,

Questo tipo di raccolta dei dati è indicato come una ricerca k-palla di neve in teoria delle reti, e dovrebbe essere abbastanza semplice in R. Come si nota, il modo più semplice per fare ciò, utilizzare il pacchetto XMl e il comando htmlTreeParse. Questo analizzerà l'HTML da un blog in un albero, che ti permetterà di eseguire più facilmente l'estrazione del link che ti interessa.

Inoltre, igraph sarebbe perfettamente in grado di rappresentare i grafici, ma ha anche una funzione utile graph.compose per prendere due grafici e restituire la composizione dell'insieme di spigoli. Avrai bisogno di questo per combinare i dati mentre continui a "lanciare la palla di neve". I passi fondamentali del processo sarebbero:

  1. trovare un po 'di semi di blog
  2. Trova tutti i vicini del seme, e creare il suo ego-net (grafico stella) con il seme al centro collegato ai suoi vicini
  3. Per tutti i vicini del seme, crea le loro reti ego e componi iterativamente quei grafici con il loro grafico originale.
  4. Ripeti per tutti i passaggi di k-degree che ti interessano raccogliere.

Non ho codice per questo in R, ma ho generated code that performs a very similar process in Python using Google's SocialGraph API.

Buona fortuna!

+0

Molte grazie Drew, ci provo (spero che lo farò funzionare in tempo). –