通过R进行网页爬取

时间:2020-06-23 14:18:58

标签: r web-scraping

我有一个Excel文件,其中包含某些需要通过R在google中搜索的关键字。 要创建的输出是一个数据框,其中包含以下变量:

关键字;位置(URL在搜索结果中的位置);标题(第i个搜索结果的标题);文本(该搜索结果中的文本); URL;域 关键字和输出示例在下面的链接中给出:

https://drive.google.com/file/d/1AM3d5Hbf5nBpbRG1ydnZM7ZG2AdUyy-6/view?usp=sharing

(第1页包含关键字,第2页包含示例输出)

我试图创建类似的输出,但是似乎有一个错误。 代码:

# Web Scraping in R
library(XML)
library(RCurl)
library(dplyr)
library(rvest)
library(urltools)
library(htm2txt)
library(readxl)

data <- read_excel(file.choose()) # Importing the data
output <- data.frame(matrix(ncol=6,nrow=0))
colnames(output) <- c("Name","Position","Title","Text","URL","Domain")

for (i in 1:nrow(data)) {
  search.term <- data[i,1]
  getGoogleURL <- function(search.term, domain = '.com', quotes=TRUE) 
  {
    search.term <- gsub(' ', '%20', search.term) # Cleaning the Search Term
    if(quotes) search.term <- paste('%22', search.term, '%22', sep='') 
    getGoogleURL <- paste('http://www.google', domain, '/search?q=',
                          search.term, sep='')
  }
  quotes <- "False"
  search.url <- getGoogleURL(search.term=search.term, quotes=quotes)
  page <-  read_html(search.url)
  links <- page %>% html_nodes("a") %>% html_attr("href")
  link <- links[startsWith(links, "/url?q=")]
  link <- sub("^/url\\?q\\=(.*?)\\&sa.*$","\\1", link)
  for (j in 1:length(link)) {
    page1 <- read_html(link[j])
    name <- data[i,1]
    position <- j
    title <- page1 %>% html_node("title") %>% html_text()
    text <- gettxt(link[j])
    url <- link[j]
    domain <- suffix_extract(domain(link[j]))$host
    vect <- c(name,position,title,text,url,domain)
    output <- rbind(output,vect)
    }
  
}

显示的错误是:

Error in match.names(clabs, nmi) : names do not match previous names

请帮助,我是R的新手。

1 个答案:

答案 0 :(得分:1)

当列的排列不完全时,该错误来自rbind。例如,如果缺少一列或多余的列。在这种情况下,可能是因为您的vect变量之一为空/ NULL或长度超过1。

rbind(data.frame(a=1,b=2), data.frame(b=3))
# Error in rbind(deparse.level, ...) : 
#   numbers of columns of arguments do not match

由于迭代地将行添加到框架会变得很昂贵(每次甚至添加一行也都会生成框架的完整副本,因此效率非常低),因此通常最好将其追加到list并转换为一帧通话。

out <- list()
for (i in seq_len(nrow(data))) {
  # ...
  for (j in seq_along(link)) {
    # ...
    vect <- c(name, position, title, text, url, domain)
    stopifnot(length(vect) == 6L)
    out <- c(out, list(vect))
  }
}
outout <- do.call(rbind.data.frame, out)
colnames(output) <- c("Name", "Position", "Title", "Text", "URL", "Domain")

(实际上,代替法令stopifnot的人可能会将URL和检索到的数据记录到不同的list中,以进行取证。或者找到丢失的元素并NA,然后再添加到无论哪种方式,stopifnot都打算在这里作为占位符,用于与您和您的流程相关的内容。)