【问题标题】:I'm trying to webscrape, but I'm failing at a loop. Using R我正在尝试进行网络抓取,但我在循环中失败了。使用 R
【发布时间】:2020-07-09 13:06:10
【问题描述】:

每个人。我知道这很愚蠢,我不会问我是否没有在这里检查每个 for 循环 答案。

但我需要抓取 95 页,但我不知道如何循环播放。

这是代码:

url <- "https://www.riksdagen.se/sv/Dokument-Lagar/?datum=2000-01-01&q=kvinn&st=2&tom=2018-12-31&doktyp=fr&p="

page <- read_html(url)
title_html <- html_nodes(page,'.medium-big')    
text_html <- html_nodes(page,'.font-bold')   
full_html <- html_nodes(page, '.medium-smaller')
text_html[[21]] <- NULL
full_html[c(1, 21, 22)] <- NULL
title <- html_text(title_html)
text <- html_text(text_html)
full <- html_text(full_html)
frame <- data.frame(title, text, full) 

它得到了我需要的一切,除了我需要逐页浏览。我正在使用 rvest 和 dplyr。

提前致谢。

【问题讨论】:

  • 是否要循环访问不同的 URL?是这样吗?只需创建一个函数,接收url 作为输入并输出frame,然后通过URL 向量输出lapply

标签: r loops web-scraping rvest


【解决方案1】:

我假设您将 url 变量概括为字符串 url 的向量。如果是这种情况,您可以执行以下操作

urls <- c("url1", "url2", "url3")

myScrape <- function(url) {
   age <- read_html(url)
   title_html <- html_nodes(page,'.medium-big')    
   text_html <- html_nodes(page,'.font-bold')   
   full_html <- html_nodes(page, '.medium-smaller')
   text_html[[21]] <- NULL
   full_html[c(1, 21, 22)] <- NULL
   title <- html_text(title_html)
   text <- html_text(text_html)
   full <- html_text(full_html)
   data.frame(title, text, full) 
}

all_pages <- lapply(urls, myScrape)

您将需要使用代码将其转换为您想要的格式(例如,数据框列表通常没有用)但脚本现在循环!

【讨论】:

  • 如果需要,您可以使用dplyr::bind_rows(all_pages) 将所有内容合并到 1 个最终 data.frame 中。这是一个类似的问题/答案。
  • 我真的很感激这一点(尽管我还没有设法让它工作......)!
【解决方案2】:

基本上你可以这样做,但我认为你的代码对于每个页面的最后一个full_html信息有问题:

library(rvest)
url <- "https://www.riksdagen.se/sv/Dokument-Lagar/?datum=2000-01-01&q=kvinn&st=2&tom=2018-12-31&doktyp=fr&p="

data <- NULL
for (i in 1:95){
  page <- read_html(paste0(url, i))
  title_html <- html_nodes(page,'.medium-big')    
  text_html <- html_nodes(page,'.font-bold')   
  full_html <- html_nodes(page, '.medium-smaller')
  text_html[[21]] <- NULL
  full_html[c(1, 21, 22)] <- NULL
  title <- html_text(title_html)
  text <- html_text(text_html)
  full <- html_text(full_html)
  frame <- data.frame(title, text, full) 
  data <- rbind(data, frame)
}

【讨论】:

  • 这太完美了!这正是我想要做的!非常感谢! (是的,我看到完整的缺失行,我要检查页面看看它在哪里)。
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多