R selenium方法下载不同年份的数据

Posted

技术标签:

【中文标题】R selenium方法下载不同年份的数据【英文标题】:R selenium method for downloading data for different year 【发布时间】:2022-01-21 19:50:32 【问题描述】:

以下代码是在我之前在同一平台上的一个问题中编写的。我必须下载 2020 年的数据,但是一旦在给定 Web 链接的右侧列上单击 2020 年,URL 就不会改变。该代码在 Firefox 上打开 2020 页面,但未在系统中下载所需文件(2020 文件)。它正在下载我不需要的 2021 文件。我无法弄清楚这个问题。 我正在处理的 URL 是:https://www.rbi.org.in/scripts/AnnualPublications.aspx?head=Handbook%20of%20Statistics%20on%20Indian%20Economy 代码是:

 library(tidyverse)
      library(stringr)
      library(purrr)
      library(rvest)
      library(RSelenium)
      
      rD <- rsDriver(browser="firefox", port=4567L, verbose=F)
      remDr <- rD[["client"]]
      
      remDr$navigate("https://www.rbi.org.in/scripts/AnnualPublications.aspx?head=Handbook+of+Statistics+on+Indian+Economy")
elem<- remDr$findElement(using = "link text", "2020")
      elem$clickElement()
      page <- remDr$getPageSource()[[1]]
      read_html(page) -> html
      html %>%
        html_nodes("a") %>%  
        html_attr("href") %>% 
        str_subset("\\.PDF") -> urls
      urls %>% str_split(.,'/') %>% unlist() %>% str_subset("\\.PDF") -> filenames
    
      for(u in 1:length(urls)) 
      
        cat(paste('downloading: ', u, ' of ', length(urls)))
        download.file(urls[u], filenames[u], mode='wb')
      
      system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)

【问题讨论】:

您的代码对我来说运行良好。能够下载 chrome 中的文件。 只是为了确认您能够下载 2020 年的文件?因为在我的它显示正在下载,但随后系统超时并且没有下载任何内容 是的,我能够下载 2020 年的文件。打开pdf并交叉检查。 但是为什么在我的系统中没有发生呢?我想不通?你有什么想法吗?由于 R 版本或其他原因而发生?只是为了确认您是否运行了完全相同的代码? 是的,运行相同的代码。你遇到了什么错误? 【参考方案1】:

您可以通过获取手册名称来检查您是否在正确的页面上,

你现在是 2021 年

remDr$navigate("https://www.rbi.org.in/scripts/AnnualPublications.aspx?head=Handbook+of+Statistics+on+Indian+Economy")
remDr$getPageSource()[[1]] %>% 
  read_html() %>% html_nodes(xpath = '//*[@id="accordion"]/table[2]/tbody/tr[2]/td[1]/text()[1]') %>% html_text()
[1] "Handbook of Statistics on the Indian Economy, 2020-21 "

现在是 2020 年

elem<- remDr$findElement(using = "link text", "2020")
elem$clickElement()
remDr$getPageSource()[[1]] %>% 
  read_html() %>% html_nodes(xpath = '//*[@id="accordion"]/table[2]/tbody/tr[2]/td[1]/text()[1]') %>% html_text()
  [1] "Handbook of Statistics on Indian Economy 2019-20 "

编辑:-

library(tidyverse)
library(rvest)
library(RSelenium)

启动浏览器

rD <- rsDriver(browser="firefox", port=4567L, verbose=F)
remDr <- rD[["client"]]

加载网页

remDr$navigate("https://www.rbi.org.in/scripts/AnnualPublications.aspx?head=Handbook+of+Statistics+on+Indian+Economy")

点击年份2020。确保您获得正确年份的数据。

remDr$findElement(using = "link text", "2020")$clickElement()
remDr$getPageSource()[[1]] %>% 
  read_html() %>% html_nodes(xpath = '//*[@id="accordion"]/table[2]/tbody/tr[2]/td[1]/text()[1]') %>% html_text()

[1] "Handbook of Statistics on the Indian Economy, 2020-21 "

获取pdf名称、url并开始下载

urls =  remDr$getPageSource()[[1]] %>% read_html() %>% 
  html_nodes("a") %>%  
  html_attr("href") %>% 
  str_subset("\\.PDF")

filenames = urls %>% str_split(.,'/') %>% unlist() %>% str_subset("\\.PDF")

for(u in 1:length(urls))
  cat(paste('downloading: ', u, ' of ', length(urls)))
  download.file(urls[u], filenames[u], mode='wb')

【讨论】:

嗨。代码仍然只识别 2021 年的 URL,因此下载的是 2021 年而不是 2020 年的文件。此外,如果我们检查 2020 年手册名称,那么如果我必须提供多年作为输入,那么我每次都必须更改?跨度> 我找不到你。您需要单击每年以获取相应年份的 pdf。 是的。基本上,我希望如果我在代码中输入 2019 年或 2020 年,那么相应年份的文件就会被下载。 是的,无论您在该年输入的代码是什么,文件都会被下载。如果你想要多个年份的文件,那么你可以使用循环。 好的,谢谢。但是,您帮助我的代码(2020 代码)仍在下载 2021 文件。我仍然遇到同样的问题。你能告诉我应该在哪里添加这些特定的 4 行 2020 代码吗?也许我在错误的地方添加了代码,这就是为什么 2021 年仍在下载代码

以上是关于R selenium方法下载不同年份的数据的主要内容,如果未能解决你的问题,请参考以下文章

从列中提取日期并在 R 中缺少年份时添加年份

Selenium+Python调Chrome浏览器时报Traceback (most recent call last): File "C:/Users/EDZ/Desktop/sele

selenium3 无人工干预地自动下载某个文件

sele nium 模块

R语言ggplot2可视化:可视化时间序列季节图使用季节图可以比较不同年份相同月份的数据差异或者相同(年/月/周等)的时间序列在同一天的数据差异(Seasonal Plot)

在R中将具有不同长度和两个条件的不同数据帧的列相乘