【问题标题】:Looping pages for web scraping with R vectors of different length使用不同长度的 R 向量进行网页抓取的循环页面
【发布时间】:2021-03-03 21:11:08
【问题描述】:

我正在尝试从 Indeed 收集工作和公司的数据。我的目标是制作一个循环,以便它抓取给定数量的页面。问题在于,抓取向量的长度并非对所有人都相同,因为例如,并非所有工作机会都显示薪水。有什么办法可以用 NA 值“填充”相应的空格,使向量的长度相同?

listado = data.frame()

for(page_result in seq(from = 10, to = 100, by = 10)){
  link = paste("https://es.indeed.com/jobs?q=ingeniero+energ%C3%ADas+renovables&start=", page_result, sep='')
  page = read_html(link)
  
  title = page %>% html_nodes(".jobtitle") %>% html_text()
  location = page %>% html_nodes(".accessible-contrast-color-location") %>% html_text()
  descripcion =page %>% html_nodes(".summary") %>% html_text(trim=TRUE)
  fecha = page %>% html_nodes(".date") %>% html_text(trim=TRUE)
  empresa = page %>% html_nodes(".company") %>% html_text(trim=TRUE)
  listado = rbind(listado, data.frame(title, empresa, location,fecha, descripcion, stringsAsFactors = FALSE)) 
  
 
  print(paste("Page:", page_result))
}

【问题讨论】:

  • 那么你到底“坚持”了什么?目前尚不清楚您想要的输出到底是什么,您要更改什么或问题是什么。
  • 我想要的输出是一个单一的数据框,它收集了定义页数的“puesto”和“empresa”的所有值

标签: r loops web-scraping


【解决方案1】:

工作卡的结构不尽相同,您可以使用工作 ID 与功能一起浏览它们:

使用函数式方法,您可以用 NA_character 替换缺失的项目,然后所有向量对于一张作业卡具有相同的长度,因此最终对于页面中的所有作业。

我尽量不要过多地改变你的代码



listado = data.frame()
library(rvest)

page_result <- 10
for(page_result in seq(from = 10, to = 100, by = 10)){
  link = paste("https://es.indeed.com/jobs?q=ingeniero+energ%C3%ADas+renovables&start=", page_result, sep='')
  page = read_html(link)

  job_ids <- page %>%
    html_nodes(xpath = "//*[contains(@id, 'p_')]") %>%
    html_attr('id')


  node <- '.summary'
  one_item <- function(job_card, node, trim = FALSE){

    tmp_res <- job_card %>%
      .[grepl(node, .)] %>%
      html_text(trim = trim)

    if (length(tmp_res) == 0L){
      return(NA_character_)
    }
    tmp_res
  }

  one_job <- function(job){
    message("---- ", job)
    job_card <- page %>%
      html_nodes(xpath = paste0("//*[contains(@id, '", job, "' )]")) %>%
      html_children()

    tibble::tibble(
      job_id = job,
      title = job_card %>% one_item("jobtitle", trim = TRUE),
      sublabel = job_card %>% one_item("iaLabel", trim = TRUE),
      location = job_card %>% one_item("location accessible-contrast-color-location", trim = TRUE),
      descripcion = job_card %>% one_item("summary", trim = TRUE),
      fecha = job_card %>% one_item("date", trim=TRUE),
      empresa = job_card %>% one_item("company", trim=TRUE))



  }

  listado = rbind(listado, purrr::map_df(job_ids, one_job))


  message(paste("----------------------- Page:", page_result))
}

在任何情况下,如果您经常使用验证码,网站可能会检查您是否是人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2020-11-15
    • 2014-12-28
    相关资源
    最近更新 更多