Git抓取:通过抓取到Git存储库来跟踪随时间的变化

2020-10-11 15:53:54

Git刮是我给一种刮技术起的名字,我已经试验了几年了。它真的很有效,应该有更多的人使用它。

互联网上充满了有趣的数据,这些数据会随着时间的推移而变化。这些更改有时可能比底层的静态数据更有趣--例如,@NYT_DIFF Twitter帐户跟踪对“纽约时报”标题所做的更改,这为了解该出版物的编辑流程提供了一个有趣的视角。

我们已经有了一个很好的工具,可以有效地跟踪文本随时间的变化:Git。GitHub操作(和其他CI系统)可以轻松创建每隔几分钟运行一次的刮取器,记录资源的当前状态,并在提交历史记录中记录一段时间内对该资源的更改。

这里有一个最近的例子。加州的火灾继续肆虐,CAL火灾网站提供了一张事件地图,显示了该州周围最新的火灾活动。

启动Firefox Network窗格,过滤由XHR触发的请求,并按大小、最大值排序,首先显示此端点:

这是一个241KB的JSON端点,包含该州各种火灾的全部细节。

所以..。我开始用刮泥机来对付它。我的刮板程序位于GitHub上的simonw/ca-fire-History存储库中。

每隔20分钟,它就会获取该JSON端点的最新副本,使用JQ对其进行美化打印(为了不同的可读性),如果更改了,则将其提交回repo。

这意味着我现在有一个关于加州火灾信息更改的提交日志。这里有一个提交示例,显示昨晚Zogg火灾的受控百分比从90%增加到92%,涉及的人员数量从968人下降到798人,响应的引擎数量从82人下降到59人。

刮取器的实现完全包含在单个GitHub操作工作流中。它位于一个名为.github/workflow/scillpe.yml的文件中,如下所示:

名称:抓取最新数据:PUSH:WORKLOW_DISPATCH:Schedule:-cron:';6,26,46*';作业:Scheduled:Run-On:Ubuntu-最新步骤:-Name:签出此Repo使用:Actions/Checkout@v2-Name:获取最新数据运行:|-CURL https://www.fire.ca.gov/umbraco/Api/IncidentApi/GetIncidents|JQ。>;events ents.json-name:更改后提交并推送运行:|-git config user.name";Automated";git config user.email";[email protected]";git add-A timeamp=$(date-u)git Commit-m";最新数据:${timeamp}";||退出0 git推送。

它按照时间表在每小时6分钟、26分钟和46分钟运行-我喜欢像这样抵消我的cron时间,因为我假设大多数cron正好在1小时运行,所以不准时运行感觉很礼貌。

刮取器本身的工作方式是使用cURL获取JSON,然后通过管道将其通过JQ传输。漂亮地打印它,并将结果保存到invents.json。

“如果更改则提交并推送”块使用的模式仅在文件更改时才提交和推送。几个月前,我在这篇文章中写到了这种模式。

我现在有一大堆仓库在运行git刮板。我一直在给它们贴上Git-scraping主题的标签,这样它们就会出现在GitHub的一个地方(其他人也开始使用这个主题)。

早在2017年9月,当我第一次想出以这种方式使用Git存储库的想法时,我就遇到了飓风伊尔玛(Irma)。

帮助理解2017年10月以来北湾火灾的Changelog描述了一种早期尝试,试图收集与火灾相关的信息。

为旧金山的官方树列表生成提交日志仍然是我最喜欢的这项技术的应用。旧金山市维护着一个经常更新的CSV文件,其中包括该市19万棵树,我有一个追溯到一年多前对它进行的更改的提交日志。此示例使用我的csv-diff实用程序生成人类可读的提交消息。

通过抓取git回购来跟踪PG&;E的停机记录了我通过抓取PG&;E去年的停电地图来跟踪其停电影响的尝试。我使用GitPython库将提交历史记录中记录的值转换到一个数据库中,该数据库允许我运行随时间变化的可视化。

通过使用GitHub Actions和Cloud Run部署数据API来跟踪FARA,展示了我如何在存储库中跟踪美国外国代理注册法(FARA)的新注册,并使用Datasette部署最新版本的数据。

我希望通过给这项技术命名,我可以鼓励更多的人将其添加到他们的工具箱中。随着时间的推移,这是将各种有趣的数据源转换为更改日志的一种非常有效的方式。