您好,欢迎使用LCBO API?
如果您发现自己想知道“什么是 LCBO API?”,请让我解释一下。在加拿大安大略省,所有饮料酒精销售均通过一家名为安大略省酒类管制委员会 (LCBO) 的政府公司进行,该公司负责全省酒精饮料的零售和分销。 LCBO 拥有众多零售店和一个网站,其中包含每个产品、商店甚至库存水平的目录。他们出版了一份季节性目录,其中包含食谱、社论和其他称为“食品和饮料”的内容。他们每年还为我们的公共医疗保健系统贡献数十亿美元的收入。想想看,这是一个令人着迷的情况,其他地方也有类似的系统,但据我所知,没有一个地方具有 LCBO 的广度和深度。所以,现在你知道它是什么了,很酷吧?
即使您不住在加拿大安大略省,如果满足以下条件,您可能也会对此感兴趣:
在这个项目的整个过程中,我一直在接受财务支持的想法上挣扎。一方面 LCBO API 需要它,另一方面我厌倦了它会导致的并发症。好吧,现在我有这个问题的完美解决方案!
我现在正在接受血癌治疗,特别是弥漫性大 B 细胞淋巴瘤。我很快就会在其他地方写更多相关内容,但在过去的一年里,来自世界各地的人们以各种方式支持我,这改变了我。我希望我们做一些大事来表明我们也关心!
如果您过去想支持这个项目,请代表 LCBO API 向 Hamilton Health Sciences 捐款,他们正在拯救我的生命。
捐赠给汉密尔顿健康科学
我正在 Juravinski 癌症中心接受治疗,但实际上您可以选择任何选项,也可以保留默认选项。不管金额是大是小,捐款的时候他们都会通知我。我将列出一个列表来跟踪总数,让我们看看我们可以筹集多少!
最后我想特别提及我的工作场所 Crowdmark。在这一切过程中,他们都非常友善和理解,如果没有他们,我根本无法做到这一点。我们正在不懈地努力改善高等教育评估的现状。如果您关心教育和学习,我强烈建议您关注我们。
2008 年秋天,我是一名刚出道的 Web 开发人员,拥有几年的经验。我渴望挑战,也渴望得到认可。当时应用程序正在成为一种趋势,我非常想构建一个应用程序。我决定要构建一个需要我首先构建此 API 的 API。我从来没有构建过那个应用程序?
如果你研究这个代码库足够长的时间,你可能会发现挫败感、死胡同、令人困惑的问题等。我真的希望你不要关注这些或你可能发现的任何消极因素。我不再是那个人了,我也不希望你成为那个人。我对此是一本打开的书!打开一个问题并向我提问,我会尽可能诚实和尊重,我只要求你也这样做。
我正在 GNU GPLv3 下发布这个项目,我认为对于这样的项目来说这是最公平、最负责任的选择。如果您有不同的感觉,请提出问题,我们可以公开讨论。我只是恭敬地请求您不要重复使用品牌和设计。我同意重复使用文档,但如果您想部署此应用程序自己的孤立版本,则必须更改样式、标识和品牌。
如果我们不是尝试在一个地方以一种风格完成所有事情,而是考虑更大的单一应用程序,会怎么样?如果爬虫又是一个单独的项目,负责收集和规范化数据,其他人可以在他们希望的任何平台上构建 API 节点,这些节点将向数据提供者注册并在可用时接收更新的数据,并将该数据提供给所有不同类型的用户。
我们可以集中精力为这些数据创造价值,而不是争夺数据的所有权,而不是让数十个类似的 API 服务器尝试做同样的事情,争夺 LCBO.com 的资源。我们可以让其他学科参与进来,以产生超越显而易见的新价值,让精酿啤酒和葡萄酒社区参与进来,在此基础上发展,使其比安大略省更大。
我不知道这样的事情有多可行,但我知道如果其他人感兴趣,我很乐意进行这些讨论。
此外,也许我们应该考虑向企业用户收取访问 API 节点的合理费用,这笔钱可以用来支付托管成本以保持可持续发展,也可以用来资助针对不能喝酒的人的支持计划,或者不想喝酒,或者想少喝酒,回馈我们的社区并真正做出改变。
但我需要其他人帮助分担维护和管理这一切的负担,我和我家人的健康和幸福是第一要务,其次是我的事业,然后是我的朋友和社区。这个项目不再是我的第一大时间消耗点,它对我来说不可持续,而且对我来说也不健康。但如果您受到此消息的启发,请与我联系,最好是公开联系,但一开始私下也可以。
我希望这能让你兴奋!
我无法控制自己,我写了更多关于我的想法:doc/lcboapi-propose.md
现在,把这些都搞清楚了,我们可以开始了解我这样做的真正目的是为了谁,以及是什么让我兴奋和受到启发去做这件事:学习和成长的机会,以及帮助其他人做同样的事情的机会。对于那些好奇的人来说,让我们看看这是怎么回事?
您可以直接在主机环境上运行该应用程序,就系统依赖性而言,它不需要任何太花哨的东西。我在Apple硬件上开发,如果你也这样做,你可能会成功使用Postgres.app和Homebrew来安装Redis。否则,您可以使用 Docker。
如果您有使用其他平台的经验,请提出 PR 或问题,我们可以将您的平台添加到自述文件中。
另外,如果接下来的内容对您来说没有意义,请提出一个问题,也许我们可以做一个截屏视频来演示该过程,或者也许有擅长这方面的人来承担这个任务?
我下面描述的只是设置开发环境以在计算机上运行 LCBO API 的一种方法。如果其他人有改进(有很多空间,例如引导开发数据库的入口点脚本)或者甚至不同的方法,例如使用 Vagrant + VirtualBox、打开问题或 PR,我很乐意添加它们。
如果你想帮忙,我想为你提供帮助。
config/secrets.yml
和.env
首先,您需要设置一些公共存储库中未提供的配置。这样做的原因是为了保护 API 密钥和秘密令牌等私有数据,但也因为一些开发人员可能更喜欢根据个人喜好和类似的事情使用稍微不同的设置。
您需要创建几个文件: config/secrets.yml
和.env
。仓库中的config/secrets.yml.example
和.env.example
下有模板版本,您可以复制这些文件来开始:
cp config/secrets.yml.example config/secrets.yml
cp .env.example .env
如果您只想启动应用程序并在本地访问它,那么此时您应该可以开始了。如果您希望能够使用爬网程序并将快照保存到 Amazon S3,则需要将 AWS 凭证和存储桶添加到config/secrets.yml
。
其余的设置要么只在生产环境中真正重要,要么没有真正使用,或者仅在您不喜欢默认首选项时才重要。与往常一样,如果您需要澄清,请公开并提出问题,我很乐意提供帮助。
首先,您需要为您的系统安装 Docker 客户端,您可以在此处找到相关信息。安装 Docker 后,您就可以开始使用了:
接下来,您需要构建容器:
docker-compose build
完成后,您可以通过发出以下命令来启动整个过程:
docker-compose up
此时,数据库中还没有任何数据,因此如果加载应用程序,http://localhost:3000,它不会做太多事情,它毕竟提供数据,而且里面没有数据。那么让我们为此做点什么吧。
继续并关闭容器:
Ctrl-C
这意味着,同时按Control
+ C
键。
您可以在此处从我的个人 Amazon S3 帐户下载最新生产数据库转储的存档。请注意,存在敏感表(电子邮件、用户、密钥)并且数据已从该文件中排除。
下载并解压该项目的tmp
目录中的存档:
cd tmp
curl -O https://heycarsten.s3.amazonaws.com/lcboapi-2019-01-21.tgz
tar xzf lcboapi-2019-01-21.tgz
cd ..
该文件约为 300MiB,因此下载可能需要一段时间,具体取决于您的连接速度(这种情况发生在以curl
开头的行上)。
下载并解压数据库文件后,您可以将数据加载到数据库中:
docker-compose run --rm app rake db:create
docker-compose run --rm app bash -c 'pv tmp/lcboapi-2019-01-21.sql | psql -q -h db -U $POSTGRES_USER $POSTGRES_DB > /dev/null'
第一行以rake db:create
结尾,将在 Postgres 中创建数据库模式用于开发和测试,第二行将数据库转储加载到开发数据库中。进度条指示有多少数据已通过管道传输到数据库中,一旦完成,将构建索引。这可能需要一些时间,具体取决于您的机器,这是相当大量的数据。然后您可以再次启动该应用程序:
docker-compose up
此时,您还可以安全地从tmp
目录中删除存档和提取的 SQL 文件。
如果您发现输入
docker-compose
一遍又一遍地乏味,请查看 shell 别名您可以将别名行添加到您的 shell 配置文件中,例如
alias dc=docker-compose
,然后您只需键入dc
而不必每次都键入docker-compose
。 ✅想想您可以创建其他别名来进一步改进这一点吗?
现在,导航到 http://localhost:3000/products/438457
繁荣。您的计算机上已经运行了 LCBO API! ? ? ?
当您完成应用程序的工作后,只需按Ctrl+C
即可关闭所有内容。下次你想再次处理它时,运行docker-compose up
就可以了!
如果您向Gemfile
添加新的 gem,则需要重新安装软件包并更新依赖项。 Docker 非常擅长做到这一点,它可以告诉Gemfile
何时发生变化,并且它知道为您重建app
容器。
要启动 Rails 控制台并检查应用程序内的对象:
docker-compose exec app rails c
一旦运行,您可以执行以下操作:
获取数据库中的第一个产品:
Product.first
找到 LCBO 零售店 #25(我当地的商店):
Store.find(25)
如果您更改应用程序中的代码,则需要重新reload!
控制台中的命令刷新更改。
在spec
文件夹内,您将找到 LCBO API 的测试套件。遗憾的是它并不全面,但也不算太糟糕。我在整个职业生涯中都在努力维护我满意的测试套件。我们应该改进这些测试!
运行测试套件:
docker-compose exec app rspec
你会看到一堆绿点.
,其中每一个都代表一个通过的测试用例。那挺好的。如果发生故障,您会看到一个红色的F
,这很糟糕......只是开玩笑!其实也挺好的!测试使您能够更改现有代码库中的内容,并查看是否会导致现有功能出现任何回归。当然,没有什么是完美的,但我可以毫无疑问地告诉你,从经验来看,测试是好的。
随着应用程序变得越来越大、越来越复杂,没有测试就变成了一场真正的噩梦,这使得更改应用程序和添加功能成为一个极其脆弱的过程。使用带有类型系统的语言和其他各种不同的编程范式也可以在很大程度上帮助解决这个问题,但我认为至少有一个可靠的验收测试套件是无可替代的。
这是 LCBO API 的一部分,它使整个事情成为可能。复杂网站的爬虫很难构建和维护。 LCBO API 的第一个版本有一个完整的爬虫测试套件,当很多年前一切都发生了变化时,我放弃了那个代码库,只是在这个代码库中尽可能快地构建一些东西。
爬虫逻辑位于lib/crawler.rb
中,从那里您将看到连续发生的所有各种任务,以包含 LCBO 网站的完整爬行。
解析器逻辑位于lib/lcbo.rb
以及lib/lcbo/*
中的所有各种文件中,这包括需要发生的所有各种请求,以及负责将这些请求中的数据转换为结构化数据的代码最终可以进入数据库。
我设计的爬虫以串行方式执行请求,这是爬行一个网站时一种非常好的方法。这对一个人来说很简单,如果可以的话,这始终是最好的选择,而且很有礼貌。我们可以启动n 个AWS Lambda 作业并在几秒钟内抓取 LCBO.com 上的每个页面,但这很粗鲁,而且我们可能会暂时对他们的网站进行 DDoS,这不好。
/manager
)这包括一个 Ember 应用程序,当您注册/登录 LCBO API 并生成 API 密钥时,这就是您正在与之交互的内容。它已经过时了,我还没有尝试过构建它。我从零天起就开始使用 Ember,所以如果您对此有任何疑问,请提出问题。实际上,我很乐意讨论 LCBO API 的这一部分,并与大家一起改进它。
/static
)这包含一个中间人站点,当您访问 lcboapi.com 时,这就是您正在查看的内容。它还包含一个非常小的(也过时的)React 应用程序,它是主页右侧的“尝试一下”。它有自己的 Gemfile 和构建脚本static/generate
,运行时它会构建站点并将更改同步到public
文件夹中。在 Rails 应用程序中, public
文件夹作为静态内容提供。
这个代码库中有很多死胡同,分支已经完成了 40-60-80% 的功能,然后停滞不前,实验等等。一如既往,如果你发现一些让你喜欢的东西?只需提出问题,我会尽快回复。
如果我们能在这里解决一些死胡同,那就太酷了,我对最终添加 JSON:API 和 GraphQL 非常感兴趣。当前的 API 响应设计来自 2008 年!在某种程度上,我有点惊讶没有人对此抱怨。
到目前为止,我从未实现过的最受欢迎的功能是类别,它就在这里,我忘记了为什么我从未发货它,我不记得最终的东西必须到位,但也许这将是一个很好的第一个要解决的事情?还有《Producers》和《Origins》,这些都从未被完全包裹起来。
我还有一大堆其他存储库和多年来所做的小实验,我总是对库存水平预测的想法着迷,某处有一个用 Go 编写的数据集转储分析工具,用于分析特定产品库存的 CSV 转储在一段时间内。如果有兴趣的话我也很乐意发布这些东西。
我暂时把它留在这里,等待你的回复。我很乐意以人们希望看到的任何方式(截屏视频、访谈、内联文档等)继续添加这个知识库。我也希望您也这样做,如果您不确定,请询问。 ❤️