无法下载完整的数据库文件

问题描述

我正在尝试使用以下代码从GitHub存储库下载db文件

library(Rsqlite)
library(curl)

url <- "https://github.com/kotartemiy/newscatcher/tree/master/newscatcher/data/package_RSS.db"
curl::curl_download(url = url,destfile = "inst/external-data/package_RSS.db",quiet = TRUE,mode = "wb")

可以使用,但是下载的文件大小在79Kb和82Kb之间(取决于我使用的模式)。但是当我尝试访问数据库文件时,得到警告:

sqlite.driver <- dbDriver("sqlite")
db <- dbConnect(sqlite.driver,dbname = "inst/external-data/package_RSS.db")

警告信息: 无法设置同步模式:文件不是数据库 使用synchronous = NULL可以关闭此警告。

随后出现错误

dbListTables(db)

错误文件不是数据库

可以使用download.file()和不同的mode参数来复制。但是,如果我手动下载文件,则文件大小为376 Kb,Rsqlite代码可以正常工作。是什么原因引起的?谢谢

解决方法

正如@ 27ϕ9所说,您正在下载网页,而不是它所引用的文件。

url <- "https://github.com/kotartemiy/newscatcher/tree/master/newscatcher/data/package_rss.db"
download.file(url,"~/Downloads/package_rss.db")
# trying URL 'https://github.com/kotartemiy/newscatcher/tree/master/newscatcher/data/package_rss.db'
# Content type 'text/html; charset=utf-8' length unknown
# downloaded 82 KB

readLines("~/Downloads/package_rss.db",n=10)
#  [1] ""                                                                      
#  [2] ""                                                                      
#  [3] ""                                                                      
#  [4] ""                                                                      
#  [5] ""                                                                      
#  [6] "<!DOCTYPE html>"                                                       
#  [7] "<html lang=\"en\">"                                                    
#  [8] "  <head>"                                                              
#  [9] "    <meta charset=\"utf-8\">"                                          
# [10] "  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">"

如果在浏览器中转到该URL,您将在页面上看到两个链接:

  1. “下载”按钮将您带到raw.githubusercontent.com(link)下的链接,因此您可以寻找该URL;

  2. 还有一个“查看原始”链接,该链接采用您开始时使用的相同网址,将/tree/替换为/blob/,并附加?raw=true({{3} }。

link

(虽然可以通过rvest html并以编程方式获取链接,但我认为仅以正确的URL开头才是首选路线。)