R自动化网页文本抓取

时间:2018-08-10 23:40:43

标签: r web-scraping rvest scrape

我正在尝试使用rvest自动从网站上抓取文本,但是当我尝试从向量book.titles.urls读取网页网址的循环时,出现以下错误。但是,当我尝试从单个页面(无循环)中抓取所需文本时,它就可以正常工作:

工作代码

library(rvest)
library(tidyverse)

#Paste URL to be read by read_html function
lex.url <- 'https://fab.lexile.com/search/results?keyword=The+True+Story+of+the+Three+Little+Pigs'
lex.webpage <- read_html(lex.url)

#Use CSS selectors to scrape lexile numbers and covert data to text
lex.num <- html_nodes(lex.webpage, '.results-lexile-code')
lex.num.txt <- html_text(lex.num[1])

lex.num.txt
> lex.num.txt
[1] "AD510L"

代表

library(rvest)
library(tidyverse)

book.titles <- c("The+True+Story+of+the+Three+Little+Pigs",
             "The+Teacher+from+the+Black+Lagoon",
             "A+Letter+to+Amy",
             "The+Principal+from+the+Black+Lagoon",
             "The+Art+Teacher+from+the+Black+Lagoon")
book.titles.urls <- paste0("https://fab.lexile.com/search/results?keyword=", book.titles)

out <- length(book.titles)
for (i in seq_along(book.titles.urls)) {
  node1 <- html_session(i)
  lex.url <- as.character(book.titles.urls[i])
  lex.webpage <- read_html(lex.url[i])
  lex.num <- html_nodes(node1, lex.webpage[i], '.results-lexile-code')
  lex.num.txt <- html_text(lex.num[i][1])
  out <- lex.num.txt[i]
}

错误代码

  

httr :: handle(url)中的错误:is.character(url)不正确

1 个答案:

答案 0 :(得分:2)

该错误是由于您将一个整数传递给html_session函数,该函数需要一个字符串(即url)。我认为没有必要创建会话,通常,如果需要使用用户ID和密码登录网站,则可以使用此功能。

您可以简化循环:

#output list
output<-list()
j<-1   #index
for (i in book.titles.urls) {
  lex.num <- html_nodes(read_html(i), '.results-lexile-code')
  # process the  returned list of nodes, lex.num, here
  output[[j]]<-html_text(lex.num)
  j<-j+1
}

我尚未对此进行测试,但是我将提供以下警告:刮取网站时,请确保您同意并遵守服务协议的条款。

编辑: 这是使用lapply的进一步简化,它返回带有每个调用语句结果的向量列表

library(dplyr)
listofresults<-lapply(book.titles.urls, function(i) {read_html(i) %>% 
    html_nodes( '.results-lexile-code') %>% 
    html_text()})