
学习如何使用Puppeteer和使用OpenFaaS构建的无服务器函数来抓取网页。
web测试和抓取介绍
在这篇文章中,我将向您介绍Puppeteer,并向您展示如何使用它来使用OpenFaaS功能自动化和抓取网站。
有两个主要的原因,你可能想自动化一个网络浏览器:
对应用程序运行遵从性和端到端测试
从一个没有可用API的网页收集信息
当测试一个应用程序时,有许多选项,这些选项分为两类:呈现的网页,使用JavaScript和一个真正的浏览器运行,以及基于文本的测试,它只能解析静态HTML。可以想象,在内存中加载一个完整的web浏览器是一项繁重的任务。在之前的工作中,我大量使用Selenium,它有针对c#、Java、Python、Ruby和其他语言的语言绑定。虽然我们的团队试图在单元测试层中实现大多数测试,但是在某些情况下,自动化web测试增加了价值,这意味着QA团队可以在开发人员开始编码之前编写用户验收测试(UATs),从而参与到开发周期中。
Selenium在业界仍然很流行,它激发了Webdriver API的W3C工作草案,浏览器可以实现这个工作草案来简化测试。
另一个用例不是测试网站,而是在API不可用或没有所需端点时从网站中提取信息。在某些情况下,您会看到这两种使用情况的混合,例如——当特定的司法管辖区不提供API时,公司可能会使用自动的web浏览器通过web页面提交税务文档。
用AWS Lambda踢轮胎
最近,我了解到一个朋友通过他的SaaS产品提供商标搜索,为此他选择了一个名为Puppeteer的更现代的Selenium替代品。事实上,如果你在StackOverflow或谷歌中搜索“抓取和Lambda”,你很可能会看到“Puppeteer”和“headless chrome”一起出现。我很想用AWS Lambda试试Puppeteer,但这条路并不理想,几乎每一步都有摩擦。
流行的aws-chrome-lambda npm模块的大小超过40MB,因为它提供的是静态二进制文件,这意味着它不能作为一个普通的Lambda zip文件或Lambda层上传
zip文件需要通过与函数所在区域相同的AWS S3存储桶上传
这个层可以从你的函数中引用。
本地测试非常困难,并且有许多关于获得正确的npm模块组合的StackOverflow问题
我确信这是可以做到的,而且正在大规模地进行。对于小企业来说,如果他们不花太多时间与上述问题作斗争,并且能够保持在免费的层次内,这将是非常有吸引力的。
AWSλ截图
得到一个简单网页的标题- 15.5秒
也就是说,OpenFaaS可以运行在任何地方,甚至在5-10美元的VPS上,因为OpenFaaS使用的是容器,这让我开始思考。
还有别的办法吗?
所以我想看看使用OpenFaaS的体验是否会更好。所以我想看看我能不能让Puppeteer与OpenFaaS一起工作,这不是我第一次去那里。这是我时常会想起的事情。今天,有了buildkite.com提供的预编译的无头Chrome浏览器,事情似乎更简单了。
典型的任务包括登录到门户并进行屏幕截图。有趣的是,当我运行一个简单的测试来导航到一个博客并进行截屏时,在AWS Lambda上花了155秒,但在我的笔记本上本地运行的OpenFaaS上只花了1.6秒。我还能够在本地构建和测试这个函数,就像在云中一样。
预排
现在,我们将介绍使用Node.js和Puppeteer设置函数的步骤,这样您就可以修改一个示例,并尝试在AWS Lambda上运行的现有测试。
部署OpenFaaS
我们可以利用OpenFaaS的哪些特性?
将函数的超时扩展到我们想要的范围
异步并并行地运行调用
完成后获得一个带有结果的HTTP回调,比如一个JSON格式的屏幕截图或测试结果
在堆栈中使用max_inflight环境变量限制并发性。yml文件,以防止超载容器
触发来自cron或Kafka和NATS之类事件的调用
从Prometheus获得速率、错误和持续时间(红色)指标,并在Grafana中查看它们
您可以使用faasd项目将OpenFaaS部署到Kubernetes或在小型VM上。faasd项目不需要Kubernetes,而是使用containerd项目。
文档:部署OpenFaaS
对于没有耐心的人,我们的arkade工具可以让你在不到5分钟内启动和运行。你只需要在你的电脑上安装Docker。
您可以运行faas-cli describe函数来获得一个用于curl的同步或异步URL,以及该函数是否为调用做好了准备。faas-cli还可以用于调用函数,我们将在下面实现这一点。
函数异步提交。
RequestBin例子
返回到RequestBin的结果示例
每个调用都有一个惟一的X-Call-Id头,可用于跟踪和将请求连接到异步响应。
取一个屏幕截图并将其作为PNG文件返回
AWS Lambda的一个限制是它只能返回JSON响应,尽管这种方法可能有很好的理由,但OpenFaaS允许对函数进行二进制输入和响应。
让我们尝试截取页面的屏幕快照,并将其捕获到文件中。
部署一个Grafana仪表板
我们可以使用内置的Prometheus UI从函数中观察红色指标,也可以部署Grafana并访问OpenFaaS仪表板。
参见:OpenFaaS触发器
结束
现在您已经拥有了使用Puppeteer部署自动化测试和web抓取代码所需的工具。由于OpenFaaS可以利用Kubernetes,您可以使用自动伸缩的节点池和比通常基于云的功能产品更长的超时。OpenFaaS可以很好地与其他工具合作,比如支持异步调用的NATS、收集指标的Prometheus以及观察吞吐量和持续时间并与团队中的其他人共享系统状态的Grafana。
预编译版本的Chrome包括docker-puppeteer和os - Chrome -lambda不会运行在树莓派或ARM64机器上,但有一个可能,他们可以重新构建。如果你想从Raspberry Pi或者ARM64服务器上快速抓取网页,你可以考虑其他的选择,比如scrapy。
最后,我在这里会有一些偏见,但是我发现让Puppeteer使用OpenFaaS比使用AWS Lambda要简单得多,所以我认为您应该尝试一下。
