首页 > 解决方案 > R中的webscraper中的页码功能错误

问题描述

library(rvest)
library(RCurl)
library(XML)
library(stringr)


#Getting the number of Page

getPageNumber <- function(URL) {
  print(URL)
  parsedDocument <- read_html(URL)
  pageNumber <- parsedDocument %>%
    html_nodes(".al-pageNumber") %>%
    html_text() %>%
    as.integer()
  return(ifelse(length(pageNumber) == 0, 0, max(pageNumber)))
}

findURL <- function(year_chosen){
  if (year_chosen >= 1994) {
    noYearURL <- glue::glue("https://academic.oup.com/dnaresearch/search-results?rg_IssuePublicationDate=01%2F01%2F{year_chosen}%20TO%2012%2F31%2F{year_chosen}")
    pagesURl <- "&fl_SiteID=5275&page="
    URL <- paste(noYearURL, pagesURl, sep = "")
    # URL is working with parameter year_chosen
    firstPage <- getPageNumber(URL)
    paste(firstPage)
    
    if (firstPage == 5) {
      nextPage <- 0
      while (firstPage < nextPage | firstPage != nextPage) {
        firstPage <- nextPage
        URLwithPageNum <- paste(URL, firstPage-1, sep = "")
        nextPage <- getPageNumber(URLwithPageNum)
      }
    }else {
      print("The Year you provide is out of range, this journal only contain articles from 1994 to present")
    }
  }
}
findURL(2018) 

上面的代码是我的网络爬虫的一部分。主要是我想做的是在给定参数年份的情况下获取所有期刊的页面。我相信我的 getPageNumber 是错误的,因为我只能获取从第一页看到的页面数量,而不是获取一年中给出的所有页面。

然后我的主要功能是根据页面错误地抓取网址。

我想补充一点,我一年最多想抓取的页面是 5

我真的很感激任何帮助!先感谢您

标签: htmlrif-statementurlweb-scraping

解决方案


看起来页数需要根据总结果/每页结果数来计算,因为有时页面会被下一个隐藏。您可能需要针对错误的 url 或没有结果的 url 进行改进,并且当前正在抓取的脚本标记中未指明这一点(通过正则表达式)。也许包裹在外部 tryCatch 中。

getPageNumber <- function(URL) {
  print(URL)
  parsedDocument <- read_html(URL)
  results_per_page <- length(parsedDocument %>% html_nodes(".sr-list"))
  total_results <- parsedDocument %>%
    toString() %>%
    str_match(., 'num_results":"(.*?)"') %>% 
    .[,2] %>%
    as.integer()
  pageNumber <- tryCatch(ceiling(total_results / results_per_page), error = function(e) {1})
  return(pageNumber)
}


getPageNumber("https://academic.oup.com/dnaresearch/search-results?fl_SiteID=5275&rg_IssuePublicationDate=01%2f01%2f2018+TO+12%2f31%2f2018&page=1")

推荐阅读