使用 R 在文件上模仿 "clicking" 来下载它

Use R to mimic "clicking" on a file to download it

我希望 R 自动从 this page 下载关于石油和天然气钻井平台的 excel 文件。该文件是通过单击“北美旋转钻机计数枢轴 Table(2011 年 2 月 - 当前)”(第二个选项)下载的,但我似乎找不到办法这在 R.

有线索吗?谢谢!

注意: 不幸的是,使用 download.file() 似乎不起作用。我尝试在 MS Excel 中打开文件时收到一条消息,提示扩展名不正确或文件已损坏。使用 readxl::read_excel() 时,我也在 R 中遇到此错误:错误:评估错误:unzGetCurrentFileInfo

中的 zipfile 错误 -103

一些库可以提供帮助
您实际上只需要 dplyrpurrr、stringr 和 xml2.

library(tidyverse)
library(rvest)
#> Loading required package: xml2
#> 
#> Attaching package: 'rvest'
#> The following object is masked from 'package:purrr':
#> 
#>     pluck
#> The following object is masked from 'package:readr':
#> 
#>     guess_encoding
library(htmltab)
library(xml2)
library(readxl)

我喜欢这样做,因为有些网站使用部分链接。

base <- "https://rigcount.bakerhughes.com"
url <- paste0(base, "/na-rig-count")

# find links
url_html <- xml2::read_html(url)
url_html %>% 
  html_nodes("a") %>% 
  html_attrs() %>% 
  bind_rows() -> url_tbl

查看href 内容,找到您感兴趣的模式。 您也可以在浏览器上使用 inspect,这真的很有帮助。

url_tbl %>% 
  count(href)
#> # A tibble: 22 x 2
#>    href                                                                        n
#>    <chr>                                                                   <int>
#>  1 /                                                                           1
#>  2 /email-alerts                                                               1
#>  3 /intl-rig-count                                                             1
#>  4 /na-rig-count                                                               1
#>  5 /rig-count-faqs                                                             1
#>  6 /rig-count-overview                                                         2
#>  7 #main-menu                                                                  1
#>  8 https://itunes.apple.com/app/baker-hughes-rig-counts/id393570114?mt=8       1
#>  9 https://rigcount.bakerhughes.com/static-files/4ab04723-b638-4310-afd9-…     1
#> 10 https://rigcount.bakerhughes.com/static-files/4b92b553-a48d-43a3-b4d9-…     1
#> # … with 12 more rows

也许,我注意到 static-files 可能是 href 的一个很好的模式,但后来我在 type 中找到了一个更好的模式。

url_tbl %>% 
  filter(str_detect(type, "ms-excel")) -> url_xlsx

构建我们的列表(记住要避免一些噪音,如额外的点、空格和特殊字符) 我希望有人提出更好的方法来避免这些事情

myFiles <- pull(url_xlsx, "href")
names <- pull(url_xlsx, "title")
names(myFiles) <- paste0(
    str_replace_all(names, "[\.\-\ ]", "_"), 
    str_extract(names, ".\w+$")
)

# download data
myFiles %>% 
  imap(
    ~ download.file(
      url = .x, 
      destfile = .y,
      method="curl", # might be not necessary 
      extra="-k"
    )
  )
#> $`north_america_rotary_rig_count_jan_2000_-_current.xlsb`
#> [1] 0
#> 
#> $`north_american_rotary_rig_count_pivot_table_feb_2011_-_current.xlsb`
#> [1] 0
#> 
#> $`U.S.  Monthly Averages by State 1992-2016.xls`
#> [1] 0
#> 
#> $`North America Rotary Rig Counts through 2016.xls`
#> [1] 0
#> 
#> $`U.S. Annual Averages by State 1987-2016.xls`
#> [1] 0
#> 
#> $Workover_9.xls
#> [1] 0

reprex package (v0.3.0)

于 2020-12-16 创建

现在您可以看到您的文件了。

names(myFiles) %>%
    map(
        readxlsb:read_xlsb
    ) -> myData

希望对您有所帮助。