R-自动化网页文本抓取
R-automating web page text scrape
我正在尝试使用 rvest
自动从网站抓取文本,但是当我尝试从向量 book.titles.urls
读取网页 url 的循环时,出现以下错误。但是,当我尝试从单个页面(没有循环)中抓取所需的文本时,它工作得很好:
工作代码
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"
Reprex
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]
}
错误代码
Error in httr::handle(url) : is.character(url) is not TRUE
错误是由于您将一个整数传递给 html_session 函数,该函数需要一个字符串(即 url)。我不认为有必要创建会话,如果您需要使用用户名和密码登录网站,通常会使用此功能。
您可以简化循环:
#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
的进一步简化,其中 returns 包含每个调用语句结果的向量列表
library(dplyr)
listofresults<-lapply(book.titles.urls, function(i) {read_html(i) %>%
html_nodes( '.results-lexile-code') %>%
html_text()})
我正在尝试使用 rvest
自动从网站抓取文本,但是当我尝试从向量 book.titles.urls
读取网页 url 的循环时,出现以下错误。但是,当我尝试从单个页面(没有循环)中抓取所需的文本时,它工作得很好:
工作代码
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"
Reprex
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]
}
错误代码
Error in httr::handle(url) : is.character(url) is not TRUE
错误是由于您将一个整数传递给 html_session 函数,该函数需要一个字符串(即 url)。我不认为有必要创建会话,如果您需要使用用户名和密码登录网站,通常会使用此功能。
您可以简化循环:
#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
的进一步简化,其中 returns 包含每个调用语句结果的向量列表
library(dplyr)
listofresults<-lapply(book.titles.urls, function(i) {read_html(i) %>%
html_nodes( '.results-lexile-code') %>%
html_text()})