html - 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
我真的很感激任何帮助!先感谢您
解决方案
看起来页数需要根据总结果/每页结果数来计算,因为有时页面会被下一个隐藏。您可能需要针对错误的 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")
推荐阅读
- python - 如何使用 unittest 修补具有不同返回值的链式函数?
- c++ - 获取数组中最大值的索引
- google-cloud-dataflow - 流数据流中的 ApacheBeam Python ReadAllFromText
- c# - 更改流中的文件名
- python - 我怎样才能给消息作者一个角色
- ios - 关闭应用程序时,iOS 深层链接回调不起作用
- json - 如何使用 PL/SQL 将多个 json 对象合并为一个对象
- c# - 如何使用 CosmosDB.BulkExecutor.Graph.GraphBulkExecutor.BulkDeleteAsync?
- c++ - Mac 上的 C++ Boost 存档编译错误“架构 x86_64 的未定义符号:”。使用 cmake
- mysql - 在 Hive 和 MySql 中分配权限时出错