R Web刮取Excel电子表格URL以使用openxlsx读取

时间:2018-01-04 12:49:16

标签: r web-scraping

我需要将部分Excel文件读入R.我有一些现有代码,但权限更改了源代码。以前,该文档有一个直接URL,现在只能通过网站登录页面访问该文档的链接。

有人可以告诉我哪个套餐可以实现吗? Excel文件的链接是:http://www.snamretegas.it/it/business-servizi/dati-operativi-business/8_dati_operativi_bilanciamento_sistema/ 在那里我看文件:“Dati operativi relativi al bilanciamento del sistema post Del.312 / 2016 / R / gas - Database 2018”

我添加了以前的代码,以便了解我的所作所为。如您所见,我在第一步中只需要read.xlsx。

非常感谢提前!

  library(ggplot2)
  library(lubridate)
  library(openxlsx)
  library(reshape2)
  library(dplyr)

  Bilres <- read.xlsx(xlsxFile = "http://www.snamretegas.it/repository/file/Info-storiche-qta-gas-trasportato/dati_operativi/2017/DatiOperativi_2017-IT.xlsx",sheet = "Storico_G", startRow = 1, colNames = TRUE)


  # Selecting Column R from Storico_G and stored in variable Bilres_df

  Bilres_df <- data.frame(Bilres$pubblicazione, Bilres$BILANCIAMENTO.RESIDUALE )

  # Conerting pubblicazione in date format and time
  Bilres_df$pubblicazione <- ymd_h(Bilres_df$Bilres.pubblicazione)
  Bilreslast=tail(Bilres_df,1)
  Bilreslast=data.frame(Bilreslast)
  Bilreslast$Bilres.BILANCIAMENTO.RESIDUALE <- as.numeric(as.character((Bilreslast$Bilres.BILANCIAMENTO.RESIDUALE)))

3 个答案:

答案 0 :(得分:3)

您可以通过以下方式找到.xlsx个链接:

library(rvest)
library(magrittr)

pg <- read_html("http://www.snamretegas.it/it/business-servizi/dati-operativi-business/8_dati_operativi_bilanciamento_sistema/")

# get all the Excel (xlsx) links on that page:

html_nodes(pg, xpath=".//a[contains(@href, '.xlsx')]") %>% 
  html_attr("href") %>% 
  sprintf("http://www.snamretegas.it%s", .) -> excel_links

head(excel_links)
## [1] "http://www.snamretegas.it/repository/file/it/business-servizi/dati-operativi-business/dati_operativi_bilanciamento_sistema/2017/DatiOperativi_2017-IT.xlsx"
## [2] "http://www.snamretegas.it/repository/file/it/business-servizi/dati-operativi-business/dati_operativi_bilanciamento_sistema/2018/DatiOperativi_2018-IT.xlsx"

并且,将您想要的内容传递给您的Excel阅读功能:

openxlsx::read.xlsx(excel_links[1], sheet = "Storico_G", startRow = 1, colNames = TRUE)
## data frame output here that I'm not going to show

<强> BUT !!

这是一种非常自私和不友好的方式,因为您在Excel网站上找到每次读取该文件,浪费他们的CPU和带宽以及带宽。

您应该使用Len描述的download.file()技术来缓存本地副本,并在必要时重新下载。

答案 1 :(得分:2)

如果您从网页复制URL,则可以先使用download.files()作为二进制文件下载,然后使用read.xlsx()读取数据。根据内容在网页上的更改频率,您可能最好只复制URL而不是从页面解析内容。

oldFile <- "http://www.snamretegas.it/repository/file/Info-storiche-qta-gas-trasportato/dati_operativi/2017/DatiOperativi_2017-IT.xlsx"
newFile <- "http://www.snamretegas.it/repository/file/it/business-servizi/dati-operativi-business/dati_operativi_bilanciamento_sistema/2017/DatiOperativi_2017-IT.xlsx"

if(!file.exists("./data/downloadedXlsx.xlsx")){
     download.file(newFile,"./data/downloadedXlsx.xlsx",
                   method="curl", #use "curl" for OS X / Linux, "wininet" for Windows
                   mode="wb") # "wb" means "write binary"

} else message("file already loaded locally, using disk version")

library(openxlsx)
Bilres <- read.xlsx(xlsxFile = "./data/downloadedXlsx.xlsx",
                sheet = "Storico_G", startRow = 1, colNames = TRUE)
head(Bilres[,1:3])

...和输出:

> head(Bilres[,1:3])
  pubblicazione aggiornato.il IMMESSO
1 2017_01_01_06      42736.24 1915484
2 2017_01_01_07      42736.28 1915484
3 2017_01_01_08      42736.33 1866326
4 2017_01_01_09      42736.36 1866326
5 2017_01_01_10      42736.41 1866326
6 2017_01_01_11      42736.46 1866326
> 

更新:添加逻辑以避免在下载文件后下载文件。

答案 2 :(得分:0)

这应该让你朝着正确的方向前进。

library(data.table)
mydat <- fread('http://www.snamretegas.it/repository/file/Info-storiche-qta-gas-trasportato/dati_operativi/2017/DatiOperativi_2017-IT.xlsx')
head(mydat)