【问题标题】:Reading List of webpages in R and saving the output in csv阅读R中的网页列表并将输出保存在csv中
【发布时间】:2016-08-06 10:05:31
【问题描述】:

我在 csv 文件中有一个包含 40,000 个网页地址的列表。我想在一个新的 csv 文件中读取这些页面,以便 csv 中的每个单元格都是相关网页的内容。 我可以使用以下代码读取(解析)单个网页

library(XML)

# Read and parse HTML file
doc.html = htmlTreeParse('',useInternal = TRUE)

# Extract all the paragraphs (HTML tag is p, starting at
# the root of the document). Unlist flattens the list to
# create a character vector.
doc.text = unlist(xpathApply(doc.html, '//p', xmlValue))

# Replace all \n by spaces
doc.text = gsub('\\n', ' ', doc.text)

# Join all the elements of the character vector into a single
# character string, separated by spaces
doc.text = paste(doc.text, collapse = ' ')

是否可以使用以网页地址为输入的 csv 并获取包含上述所有内容的新文件?

【问题讨论】:

  • 帮助你编写代码的人应该意识到他们正在帮助那些最有可能违反许多网站的服务条款的人(这里是 Mashable 的):“你不能使用蜘蛛、机器人、数据挖掘技术或其他自动化设备或程序来编目、下载或以其他方式复制、存储或分发服务上可用的内容。”
  • 这只是我给出的一个例子。我没有从 mashable 中收集数据。
  • 所以您证明您已验证您遵守 40,000 个 URL 所代表的网站的服务条款,或者已联系了每个有限制并获得许可的网站?跨度>
  • 我正在使用 UCI 上的公开数据

标签: html r csv parsing


【解决方案1】:

你可以试试下面的代码。它应该可以满足您的目的,但未经测试,因为我不知道您要查看的网站:

library(XML)
library(rvest)


df <- read.csv("Webpage_urls.csv", stringsAsFactors = F)

webpage_parser <- function(x){
x <- read_html(x)

  doc.html = htmlTreeParse(x, useInternal = TRUE)
  # Extract all the paragraphs (HTML tag is p, starting at
  # the root of the document). Unlist flattens the list to
  # create a character vector.
  doc.text = unlist(xpathApply(doc.html, '//p', xmlValue))

  # Replace all \n by spaces
  doc.text = gsub('\\n', ' ', doc.text)
  # Join all the elements of the character vector into a single
  # character string, separated by spaces
  doc.text = paste(doc.text, collapse = ' ')
}

all_webpages <- lapply(df, function(x) webpage_parser(x))

Pages <- do.call(rbind, all_webpages)

Parsed_pages <- cbind(df, Pages)

write.csv(Parsed_pages, "All_parsed_pages.csv", row.names = F)

如果我们想同时,我们可以使用 R 中的 doParallel 库,这将设置多个集群(R 的实例)并且应该有助于加快您的进程。

library(doParallel)
# split your webpage list into n vectors and create a list called Split_df

Split_df <- list(df1, df2, df3,..., dfn)

# Here I initiate my cluster
cl <- makeCluster(detectCores()-1)
registerDoParallel(cl)

Parsed_pages  <- foreach(i = 1:length(Split_df), .combine = rbind) %dopar%
{
  library(rvest)
  library(XML)
  all_webpages <- lapply(Split_df[[i]], function(x) webpage_parser(x))

  Pages <- do.call(rbind, all_webpages)

  Parsed_pages <- cbind(Split_df[[i]], Pages)

  Parsed_pages
}
stopCluster(cl)

write.csv(Parsed_pages, "All_parsed_pages.csv", row.names = F)

【讨论】:

  • 这需要很多时间..超过2小时..有没有可能让它更快?
  • 您可以尝试将您的网站列表拆分为相同数量的较小组,然后使用library(doParallel) 来利用您的所有核心来执行该过程
  • 我是 R 新手。我可以拆分数据,但您能告诉我更多关于核心的信息吗?
  • Error in { : task 6 failed - "no applicable method for 'xmlNamespaceDefinitions' applied to an object of class "NULL"" 这是我使用新代码时遇到的错误...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
相关资源
最近更新 更多