【问题标题】:Rvest scraping multiple data in one functionRvest 在一个函数中抓取多个数据
【发布时间】:2018-02-07 01:41:40
【问题描述】:

我知道当页面分页时如何循环,但我希望在一个循环函数中抓取多个信息/html_nodes,但我不确定你是否可以设置它。到目前为止,我已经尝试了以下方法。它基本上是一个求职网站,我想要公司名称、公司描述和空缺职位数量。

我使用sprintf 获取第 1-14 页。

urlingtek <- sprintf("https://www.jobindex.dk/virksomhedsoversigt/kanal/ingenioer?page=%d", 1:14)

我做了一个循环,它可以抓取一个数据源。

company <- function(virksomhed){
  company %>% read_html() %>% 
      html_nodes('.jix_company_name_link a') %>% 
      html_text()
}
virk <- lapply(urlingtek, virksomhed)

但如果可能的话,我希望一次将所有实用程序都清理掉。

到目前为止,我已经尝试过使用

jobvirksom <- function(alt){
    alt %>% 
        read_html() %>% 
        html_nodes('.jix_company_name_link a') %>% 
        html_text()
    html_nodes('.jix_companyindex_overview_ad_content') %>% 
        html_text()
    html_nodes('.jix_active a') %>% 
        html_text()
}

到目前为止没有任何运气。如果我能一次刮掉它会好很多,按lapply并变成一个列表。

【问题讨论】:

  • 您没有将数据传递给函数中的两个html_nodes 调用。还可以查看purrr::map_df,它可以更轻松地将多个字段组合到一个 data.frame 中。
  • 那么把 alt%>%read_html 放在最后一个 html_nodes 前面应该可以解决吗?
  • 可能不会,因为看起来您想将相同的内容传递给第二个和第三个 html_nodes 调用。更有可能您需要将第一个管道的结果保存到一个变量并将其传递给其他变量,或者使用 lapply/purrr::map 迭代第一个节点集,找到您正在尝试的每个部分提取并将它们组合成一个列表或 data.frame。

标签: r web-scraping html-parsing rvest


【解决方案1】:

这是解决方案的开始。在这种情况下,只有 14 个网页需要解析,有时只使用循环会更容易。对于这样的页数,for 循环和 lapply 之间的时间是微不足道的。

我注意到网页的格式不一致,因此当数据丢失或不一致时,此解决方案需要额外的工作。这将适用于前 2 页,并在缺少概述的第三页失败。

library(rvest)
urlingtek <- sprintf("https://www.jobindex.dk/virksomhedsoversigt/kanal/ingenioer?page=%d", 1:14)

#define empty data frame to store all data
alllistings<-data.frame()

for (i in urlingtek){
  print(i)
  #read the page just once
  page<-read_html(i)

  #parse company name
  company<-page%>%html_nodes('.jix_company_name_link a') %>% html_text()
  #remove blank company names
  company<-trimws(company)
  company<-company[nchar(company)>1]
 #parse company overview
  overv<-page %>% html_nodes('.jix_companyindex_overview_ad_content') %>% 
  html_text()
  #parse active information
  active<-page %>% html_nodes('.jix_active a') %>%  html_text()

  #create temporary dataframe to store data from this loop
  tempdf<-data.frame(company, overv, active)
  #combine temp with all data
  alllistings<-rbind(alllistings, tempdf)
}

【讨论】:

  • 谢谢,我在打没有描述的公司时看到了这个问题。一个一个地运行它们时,这不是问题,因为我合并并从中切出一条路。但是这段代码绝对给了我一个解决方法和一些可以使用的东西。
猜你喜欢
  • 2016-08-23
  • 1970-01-01
  • 2015-08-23
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
相关资源
最近更新 更多