代码之家  ›  专栏  ›  技术社区  ›  ulfelder

使用R从网页中抓取可下载文件的链接地址?

  •  14
  • ulfelder  · 技术社区  · 10 年前

    我正在尝试自动化一个过程,包括从几个网页下载.zip文件并提取其中包含的.csv。所面临的挑战是.zip文件名以及链接地址每周或每年都会发生变化,具体取决于页面。有没有办法从这些页面中抓取当前的链接地址,这样我就可以将这些地址提供给下载文件的函数?

    其中一个目标页面是 this one 。我要下载的文件是标题“2015 Realtime Complete All Africa file”下的第二个项目符号,即zipped.csv。正如我所写的,该文件在网页上被标记为“Realtime 2015 All Africa file(2015年7月11日更新)(csv)”,我想要的链接地址是 http://www.acleddata.com/wp-content/uploads/2015/07/ACLED-All-Africa-File_20150101-to-20150711_csv.zip ,但今天晚些时候情况应该会有所改变,因为数据每周一都会更新——这就是我的挑战。

    我尝试过但未能自动提取带有“rvest”和 selectorgadet 扩展。这是怎么回事:

    > library(rvest)
    > realtime.page <- "http://www.acleddata.com/data/realtime-data-2015/"
    > realtime.html <- html(realtime.page)
    > realtime.link <- html_node(realtime.html, xpath = "//ul[(((count(preceding-sibling::*) + 1) = 7) and parent::*)]//li+//li//a")
    > realtime.link
    [1] NA
    

    调用中的xpath html_node() 来自仅突出显示Realtime 2015 All Africa File(2015年7月11日更新)(csv)字段的(csv部分),然后单击页面中足够多的其他突出显示的部分,以消除所有黄色,仅保留红色和绿色。

    我是在这个过程中犯了一个小错误,还是我完全走错了方向?正如您所知,我对HTML和网页抓取没有任何经验,因此我非常感谢您的帮助。

    1 回复  |  直到 10 年前
        1
  •  23
  •   Collin    10 年前

    我认为你在一个xpath表达式中做的太多了——我会用一系列较小的步骤来解决这个问题:

    library(rvest)
    library(stringr)
    page <- html("http://www.acleddata.com/data/realtime-data-2015/")
    
    page %>%
      html_nodes("a") %>%       # find all links
      html_attr("href") %>%     # get the url
      str_subset("\\.xlsx") %>% # find those that end in xlsx
      .[[1]]                    # look at the first one