Отображение сети ссылок между блогами с использованием R? - PullRequest
5 голосов
/ 11 июля 2010

Мне хотелось бы получить совет о том, как создать и визуализировать карту ссылок между блогами, чтобы отразить "социальную сеть" между ними.

Вот как я думаю об этом:

  1. Начните с одной (или более) домашней страницы блога и соберите все ссылки на этой странице
  2. Удалите все ссылки, которые являются внутренними ссылками (то есть, если я начну с www.website.com. Затем я хочу удалить все ссылки из формы "www.website.com/***"). Но храните все внешние ссылки.
  3. Перейдите к каждой из этих ссылок (если вы их еще не посещали) и повторите шаг 1.
  4. Продолжайте, пока (скажем, не) X прыгнет с первой страницы.
  5. График собранных данных.

Я думаю, что для того, чтобы сделать это в R, нужно было бы использовать RCurl / XML (спасибо Шейну за ваш ответ здесь ) в сочетании с чем-то вроде igraph.

Но так как у меня нет опыта ни с одним из них, есть ли здесь кто-то, кто мог бы исправить меня, если я пропустил какой-либо важный шаг, или приложил какой-нибудь полезный фрагмент кода, чтобы разрешить эту задачу?

ps: Моя мотивация для этого вопроса заключается в том, что через неделю я выступаю с докладом об useR 2010 на тему «Ведение блога и R», и я подумал, что это может быть хорошим способом не только развлечь аудиторию, но и мотивировать им самим сделать что-то подобное.

Большое спасибо!

Tal

Ответы [ 2 ]

7 голосов
/ 13 июля 2010

NB. Этот пример является очень ОСНОВНЫМ способом получения ссылок и поэтому должен быть настроен, чтобы быть более устойчивым.:)

Я не знаю, насколько полезен этот код, но, надеюсь, он даст вам представление о том, в каком направлении двигаться (просто скопируйте и вставьте его в 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, я думаю, это будет иметь смысл.

В любом случае,удачи, приятель!Тони Бреял

4 голосов
/ 12 июля 2010

Tal,

Этот тип сбора данных в теории сетей называется k-snowball и должен быть довольно простым в R. Как вы заметили, самый простой способ сделать это - использовать XMl пакет и команда htmlTreeParse . Это позволит проанализировать HTML-код из блога в дереве, что позволит вам легче выполнять извлечение ссылок, которые вас интересуют.

Кроме того, igraph прекрасно подходит для представления графиков, но также имеет полезную функцию graph.compose для получения двух графиков и возврата их композиции набора ребер. Это вам понадобится для объединения данных, так как вы продолжаете «кататься по снежному кому». Основные этапы этого процесса:

  1. Найдите какой-нибудь начальный блог
  2. Найдите всех соседей семени и создайте его эго-сеть (звездный граф) с семенем в центре, соединенным с его соседями
  3. Для всех соседей семени создайте их эго-сети и итеративно составьте эти графы с их исходным графом семени.
  4. Повторите те же шаги для получения степени k, которую вы хотите собрать.

У меня нет кода для этого в R, но у меня есть сгенерированный код, который выполняет очень похожий процесс в Python с использованием Google SocialGraph API .

Удачи!

...