Как перебрать несколько сайтов, используя read_html в R? - PullRequest
0 голосов
/ 11 февраля 2019

У меня проблемы с созданием цикла для read_html и извлечением необходимой мне информации.Мне удалось создать цикл для извлечения из одного веб-сайта.

Например: ниже приведен мой код для извлечения заголовка, описания и ключевых слов с веб-сайта Amazon.

URL <- read_html("http://www.amazon.com")
library(rvest)
results <- URL %>% html_nodes("head")

library(dplyr)
records <- vector("list", length = length(results))

for (i in seq_along(records)) {
  title <- xml_contents(results[i] %>% html_nodes("title"))[1] %>% html_text(trim = TRUE)
  description <- html_nodes(results[i], "meta[name=description]") %>% html_attr("content")
  keywords <- html_nodes(results[i], "meta[name=keywords]") %>% html_attr("content")
  records[[i]] <- data.frame(title = title, description = description, keywords = keywords)
}

Но чтоесли у меня есть:

name <- c("amazon", "apple", "usps")
url <- c("http://www.apple.com,
             "http://www.amazon.com",
             "http://www.usps.com")
    webpages <- data.frame(name, url)

Как я могу включить read_html в существующий цикл, который я создал, чтобы извлечь нужную информацию, а также включить имя URL.

ЖелаемыйВыходной пример

url                      title            description               keywords
http://www.apple.com     Apple    Apple's website description     Apple, iPhone, iPad
http://www.amazon.com    Amazon   Amazon's website description    Shopping, Home, Online
http://www.usps.com      USPS     USPS's website description      Shipping, Postage, Stamps

Спасибо за все предложения.

1 Ответ

0 голосов
/ 11 февраля 2019

Нечто подобное может работать на вас.

library(rvest)
library(dplyr)

webpages <- data.frame(name = c("amazon", "apple", "usps"),
                        url = c("http://www.amazon.com",
                                "http://www.apple.com",
                                "http://www.usps.com"))


webpages <- apply(webpages, 1, function(x){
  URL <- read_html(x['url'])

  results <- URL %>% html_nodes("head")

  records <- vector("list", length = length(results))

  for (i in seq_along(records)) {
    title <- xml_contents(results[i] %>% html_nodes("title"))[1] %>% html_text(trim = TRUE)
    desc <- html_nodes(results[i], "meta[name=description]") %>% html_attr("content")
    kw <- html_nodes(results[i], "meta[name=keywords]") %>% html_attr("content")
  }

  return(data.frame(name = x['name'],
                    url = x['url'],
                    title = ifelse(length(title) > 0, title, NA),
                    description = ifelse(length(desc) > 0, desc, NA),
                    kewords = ifelse(length(kw) > 0, kw, NA)))
})

webpages <- do.call(rbind, webpages)
...