Memento Time Travel:用Wayback机器刮擦存档数据

2021-06-15 23:55:40

在上一篇文章中,我写了关于科学写作的首场机的可能性。我认为归档网页对于引用是必不可少的,因为它们阻止在引用的Web资源时不再使用链接rots。使用此博客条目,我正在研究反向选项:寻找和检索存档的网页以获取研究原因。

归档的网页作为永久存储的数据对于可重复性问题是必不可少的。但他们也是历史和比较研究的数据的宝贵研究资源。

本文从2019年重写我的博客条目,在三个方面用Wayback机器刮掉归档数据:

我将详细介绍,解释纪念协议,掌握互联网档案的归档程序与Wayback机器。

我将展示归档数据与另一个 - 更简单的研究的研究意义 - 更简单。相反,分析静态站点生成器普及排名中的年度差异,我将专注于R社区随着时间的推移开发的统计包的数量。静态站点发生器的网站结构复杂多次,并与演示目的相矛盾。 1

为了令人信服地争论存档数据的重要性,有必要提取存档数据的URL并使用这些数据进行研究问题。因此,我将展示R可以刮擦Web数据并显示数据以进行进一步分析。

MEMEMES是由Web爬网站缓存并存储在Web档案中的网页的先前版本。基于HTTP的MEMEMENO框架是对资源状态的基于时间访问的描述。

使用MEMEMES,您可以访问过去某些日期存在的Web资源版本。关于Memento项目的完整信息在RFC 7089中指定为基于时间的资源状态的基于时间访问的HTTP框架 - Memento。我将在Memento网站上使用温和的非技术介绍来解释必要的想法。

原始资源(URI-R):存在或用于存在于实时网络上的Web资源,我们要找到先前版本。

Memento(Uri-M):一个Web资源,它是原始资源的先前版本。先前版本是封装在过去的原始资源的Web资源中。

TimeGate(Uri-G):“基于给定的DateTime”决定“的Web资源,Memento最佳匹配原始资源在给定的DateTime的情况下。

TimeMap(Uri-T):归档的原始资源的纪据课题列表,例如,在线提供。

中央组件是TimeMAP资源。它是一种机器可读文档,列出了原始资源本身,它的时光及其纪据,以及相关的元数据,如纪据的档案数据项。

基于HTTP的Memento框架桥接当前和过去的网络。它促进通过介绍DateTime谈判和TimeMaps来获得给定资源的先前国家的代表。 DateTime Engotiation是内容协商的变化,它利用给定的资源的URI和用户代理的首选DATETIME。 TimeMaps列出了列出枚举封装给定资源的先前状态的资源URI。 (从RFC 7089引用)

如果过去也提供了这些页面,现在出现了问题。如果是这样:它们是否具有相同的结构在所有归档的实例中使用相同的CSS选择器?

如果过去也可以使用此页面提供的问题。如果是这样:在所有先前的归档实例中使用相同的CSS选择器具有相同的结构?

事实证明,子标题之后的第一行可以用CSS选择器#PKGS + P刮擦。

要检查段落的段落的网站结构是否具有ID =“PKGS”之后保持不变,我们可以使用WATBBACK计算机的浏览器插件(可用于Google Chrome和Firefox。)。

如果单击“中行机插件”,则可以直接转到此网页的第一个或最后一个(最近)快照。我选择“概述”以显示日历以检查已归档页面的不同实例。

该页面显示该页面是2008年5月14日之间,和4月13日,4月13日,145次归档。从此概述页面中,可以选择“贡献包”页面的不同实例和内容和设计。要了解结构中可能的更改,请从归档页面的第一个实例开始。

页面由Wayback Machine爬出的次数(在我的例子:145中)与页面更新的频率无关。

存档页面显示不同的布局。第一个标题后的包数不是在第一个标题之后立即,但在几个段落之后(见图像中的2号)。此外,标题的名称已从“可用软件包”更改为“可用捆绑包和包”。但更重要的是:本标题立即提出了段落的段落提出了不同种类的包和捆绑包的数量。检测以编程方式检测所需的数量(在本例,1425包)是挑战性的。

进一步的检查表明,ID仍然是“PKGS”。但由于第一段的文本不同,我想看看另一个页面来抓住我想要的信息更容易。

首先,我们必须安装和加载Wayback包,由Bob Rudis编写的Memento API包装器的精彩而非常实用的图书馆。 2

同时,在CRAN上存在另一个具有相同名称的包(全面的R存档网络)。它专用于安装遗留R版本,与Internet存档的WATBBACK计算机上的WATSBACK包无关。

下一步是使用get_mementos()函数。使用get_mementos(URL,timestamp = format(sys.date(),"%y"))我们将收到归档内容的相关链接的候选名单。只有第一个参数URL是强制性的。如果没有提供时间戳,则采取实际年份,最新的归档页面将是端点,在我们的情况下是可以的。该函数将返回4个链接关系类型,如在上面描述和概述的Memento框架的评论请求中。

除了这4个主要类型的链路关系之外,该函数还提供了第一个,上一个,下一个和最后一个可用的纪念品。当没有给出特定日期时,最后一个MEMEMENO与下一个(=最近的)纪念品相同。除了两个列,链路和Rel,还有第三,TS,包含时间戳(对于前3个链路关系类型为空)。总共返回值是具有八个观察(行)和三列的突然间。 3.

在Warback计算机的搜索字段中提供一个URL,将在交互式浏览器版本到图12和图13所示的日历视图中。具有归档内容的日期是蓝色或绿色(=重定向的URL)圆圈。圆圈越大,这些日期存档了更多的快照。

使用Met_MementOS函数结果的第二个观察,我们将这些日期爬网列表与Get_timemap()函数进行了解。这是我们的案例cran_link_types $ link [2]。

执行以下代码块的执行可能需要一段时间,具体取决于归档的URL页数有多少。请注意,此查询中断WATBBACK SERVER,因此请勿重复此操作。我将结果存储在我的硬盘上,并将使用保存的数据进行进一步处理。

cran_crawl_list< - readrds(" data / cran_crawl_list.rds")可反应的:: actable(cran_crawl_list,pagination = false,突出显示= true,height = 500,compact = true,tourded = true, Wrap = false,可调整大小= true)

我们收到一个带有85行的表,其中前三行与我们的目的无关,最后一行为空。所以我们得到85 - 3 - 1 = 81纪念品,符合图13的数量。纪念品的URL很长。您可以扩展/缩小列以检查URL的结构。通常,它们从“http://web.archive.org/web/”开始,后跟Memento的日期时间字符串和原始URL。

我们现在收集了纪念品的所有网址。下一个任务现在正在从这些页面获取数据并在图形中显示它们。对于最后一步,我们将使用包已验证和ggplot2。它是操纵HTML的“标准”任务,只有我们使用归档的网页的URL,只有与Memento Framework的框架只有误解。

我们只需要Memento链接,日期和新列以获取我们的可用包号码。

##──附加包──────────────────────────────────── ──

##✓GGPLOT23.3.3✓PURRR0.3.4 ##✓TIBBLE3.1.2✓✓DYR1.1.3✓STRING1.4.0 ##✓READR1.4.0✓FORCATS 0.5.1

##──冲突─────────────────────────────────────────── ──## x DOLETR :: Filter()掩码统计:: filter()## x dplyr :: lag()掩码stats :: lag()

cran_tidy_data< - readrds(" data / cran_crawl_list.rds")%>%过滤器(stringr :: str_detect(rel," memento")%>%变异(日期= Anytime :: AnyDate(DateTime))%>%add_column(pkgs = 0)%>%select(链接,日期,pkgs)saverds(cran_tidy_data," data / cran_tidy_data.rds")glimpse(cran_tidy_data )

##行:81 ##列:3 ## $ link< chr> " http://web.archive.org/web/20110926172444/http://cran.r-project ......## $ date< date> 2011-09-26,2011-10-11,2011-10-29,2011-11-29,2011-12-29,2012 ... ## $ PKGS< dbl> 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...

出于本演示的目的,我不想刮掉81个链接中的每一个,但每年只有一个链接。由于归档日期没有系统规则,我们不能每年1月1日发布时间序列。但这对这个演示并不重要。

cran_yearly_links< - readrds(" data / cran_tidy_data.rds")%>%dplyr :: mutate(年= lubrite ::年(日期),。处于=#34;日期") cran_yearly_links< - cran_yearly_links [!复制(cran_yearly_links [,"年"]),] saverds(cran_yearly_links," data / cran_yearly_links.rds")cran_yearly_links

### A Tibble:11 x 4 ##链接日期年份PKGS ##< chr> < date> < dbl> < dbl> ## 1 http://web.archive.org/web/20110926172444/http://cran ... 2011-09-26 2011 0 ## 2 http://web.archive.org/web/2012012715595954 / http:// cran ... 2012-01-27 2012 0 ## 3 http://web.archive.org/web/20130121072548/http://cran.. 2013-01-21 2013 0 ## 4 http:/ / web.archive.org/web/20140402061423/http://cran ... 2014-04-02 2014 0 ## 5 http://web.archive.org/web/20150124092856/http://cran.. 2015-01 -24 2015 0 ## 6 http://web.archive.org/web/20160104062049/https://cra.. 2016-01-04 2016 0 ## 7 http://web.archive.org/web/20170502002538 / http:// cran ... 2017-05-02 2017 0 ## 8 http://web.archive.org/web/20180822083144/htps://cra.. 2018-08-22 2018 0 ## 9 http:/ / web.archive.org/web/20190103070122/http://cran ... 2019-01-03 2019 0 ## 10 http://web.archive.org/web/20200103222850/cra... 2020-01 -03 2020 0 ## 11 http://web.archive.org/web/20210128201734/https://cra.. 2021-01-28 2021 0

虽然只有10个网页来刮擦,但这仍然需要一些时间。因此,我提供了一个进度指标,以监视程序仍然需要多长时间。

库(累积)cran_pkgs< - readrds("数据/ cran_yearly_links.rds")max = nrow(cran_pkgs)pb< - txtprogressbar(min = 0,max = max,style = 3)for(i在1:max){html< - read_html(cran_pkgs $ link [i])链接< - html_nodes(html," a")cran_pkgs $ pkgs [i]< length(links)settxtprogressbar (Pb,i)}关闭(pb)saverds(cran_pkgs,"数据/ cran_pkgs.rds")

### A Tibble:11 x 4 ##链接日期年份PKGS ##< chr> < date> < dbl> < dbl> ## 1 http://web.archive.org/web/20110926172444/http://cran ... 2011-09-26 2011 3307 ## 2 http://web.archive.org/web/20120127155954 / http:// cran ... 2012-01-27 2012 3563 ## 3 http://web.archive.org/web/20130121072548/http://cran ... 2013-01-21 2013 4262 ## 4 http:/ / web.archive.org/web/20140402061423/http://cran.. 2014-04-02 2014 5374 ## 5 http://web.archive.org/web/20150124092856/http://cran.. 2015-01 -24 2015 6221 ## http://web.archive.org/web/20160104062049/htps://cra ... 2016-01-04 2016 7722 ## http://web.archive.org/web/2017050200253/20170502002538 / http:// cran ... 2017-05-02 2017 10513#8 http://web.archive.org/web/20180822083144/htps://cra.. 2018-08-22 2018 12938 ## 9 http:/ / web.archive.org/web/20190103070122/http://cra ... 2019-01-03 2019 13645#10 http://web.archive.org/web/20200103222850/htps:/克拉... 2020-01 -03 2020 15348 ## 11 http://web.archive.org/web/20210128201734/htps://cra.. 2021-01-28 2021 17038

我不会产生复杂的图形。一个简单的线条图,看看包数如何增加,必须足够。

我已经刻了他的github回购,并看着他的脚本。我不得不说我感到沮丧,因为我注意到我仍然缺乏多少知识。尽管现在工作了四年,但有很多人认为我还必须学习! ↩︎

在许多情况下,最后一个Memento与Memento链路关系类型相同。然后撕裂只有七行。 ↩︎