來源:派臣科技|時間:2020-11-15|瀏覽:次
學(xué)習(xí)如何使用Puppeteer和使用OpenFaaS構(gòu)建的無服務(wù)器函數(shù)來抓取網(wǎng)頁。
web測試和抓取介紹
在這篇文章中,我將向您介紹Puppeteer,并向您展示如何使用它來使用OpenFaaS功能自動化和抓取網(wǎng)站。
有兩個主要的原因,你可能想自動化一個網(wǎng)絡(luò)瀏覽器:
對應(yīng)用程序運行遵從性和端到端測試
從一個沒有可用API的網(wǎng)頁收集信息
當測試一個應(yīng)用程序時,有許多選項,這些選項分為兩類:呈現(xiàn)的網(wǎng)頁,使用JavaScript和一個真正的瀏覽器運行,以及基于文本的測試,它只能解析靜態(tài)HTML。可以想象,在內(nèi)存中加載一個完整的web瀏覽器是一項繁重的任務(wù)。在之前的工作中,我大量使用Selenium,它有針對c#、Java、Python、Ruby和其他語言的語言綁定。雖然我們的團隊試圖在單元測試層中實現(xiàn)大多數(shù)測試,但是在某些情況下,自動化web測試增加了價值,這意味著QA團隊可以在開發(fā)人員開始編碼之前編寫用戶驗收測試(UATs),從而參與到開發(fā)周期中。
Selenium在業(yè)界仍然很流行,它激發(fā)了Webdriver API的W3C工作草案,瀏覽器可以實現(xiàn)這個工作草案來簡化測試。
另一個用例不是測試網(wǎng)站,而是在API不可用或沒有所需端點時從網(wǎng)站中提取信息。在某些情況下,您會看到這兩種使用情況的混合,例如——當特定的司法管轄區(qū)不提供API時,公司可能會使用自動的web瀏覽器通過web頁面提交稅務(wù)文檔。
用AWS Lambda踢輪胎
最近,我了解到一個朋友通過他的SaaS產(chǎn)品提供商標搜索,為此他選擇了一個名為Puppeteer的更現(xiàn)代的Selenium替代品。事實上,如果你在StackOverflow或谷歌中搜索“抓取和Lambda”,你很可能會看到“Puppeteer”和“headless chrome”一起出現(xiàn)。我很想用AWS Lambda試試Puppeteer,但這條路并不理想,幾乎每一步都有摩擦。
流行的aws-chrome-lambda npm模塊的大小超過40MB,因為它提供的是靜態(tài)二進制文件,這意味著它不能作為一個普通的Lambda zip文件或Lambda層上傳
zip文件需要通過與函數(shù)所在區(qū)域相同的AWS S3存儲桶上傳
這個層可以從你的函數(shù)中引用。
本地測試非常困難,并且有許多關(guān)于獲得正確的npm模塊組合的StackOverflow問題
我確信這是可以做到的,而且正在大規(guī)模地進行。對于小企業(yè)來說,如果他們不花太多時間與上述問題作斗爭,并且能夠保持在免費的層次內(nèi),這將是非常有吸引力的。
AWSλ截圖
得到一個簡單網(wǎng)頁的標題- 15.5秒
也就是說,OpenFaaS可以運行在任何地方,甚至在5-10美元的VPS上,因為OpenFaaS使用的是容器,這讓我開始思考。
還有別的辦法嗎?
所以我想看看使用OpenFaaS的體驗是否會更好。所以我想看看我能不能讓Puppeteer與OpenFaaS一起工作,這不是我第一次去那里。這是我時常會想起的事情。今天,有了buildkite.com提供的預(yù)編譯的無頭Chrome瀏覽器,事情似乎更簡單了。
典型的任務(wù)包括登錄到門戶并進行屏幕截圖。有趣的是,當我運行一個簡單的測試來導(dǎo)航到一個博客并進行截屏?xí)r,在AWS Lambda上花了155秒,但在我的筆記本上本地運行的OpenFaaS上只花了1.6秒。我還能夠在本地構(gòu)建和測試這個函數(shù),就像在云中一樣。
預(yù)排
現(xiàn)在,我們將介紹使用Node.js和Puppeteer設(shè)置函數(shù)的步驟,這樣您就可以修改一個示例,并嘗試在AWS Lambda上運行的現(xiàn)有測試。
部署OpenFaaS
我們可以利用OpenFaaS的哪些特性?
將函數(shù)的超時擴展到我們想要的范圍
異步并并行地運行調(diào)用
完成后獲得一個帶有結(jié)果的HTTP回調(diào),比如一個JSON格式的屏幕截圖或測試結(jié)果
在堆棧中使用max_inflight環(huán)境變量限制并發(fā)性。yml文件,以防止超載容器
觸發(fā)來自cron或Kafka和NATS之類事件的調(diào)用
從Prometheus獲得速率、錯誤和持續(xù)時間(紅色)指標,并在Grafana中查看它們
您可以使用faasd項目將OpenFaaS部署到Kubernetes或在小型VM上。faasd項目不需要Kubernetes,而是使用containerd項目。
文檔:部署OpenFaaS
對于沒有耐心的人,我們的arkade工具可以讓你在不到5分鐘內(nèi)啟動和運行。你只需要在你的電腦上安裝Docker。
您可以運行faas-cli describe函數(shù)來獲得一個用于curl的同步或異步URL,以及該函數(shù)是否為調(diào)用做好了準備。faas-cli還可以用于調(diào)用函數(shù),我們將在下面實現(xiàn)這一點。
函數(shù)異步提交。
RequestBin例子
返回到RequestBin的結(jié)果示例
每個調(diào)用都有一個惟一的X-Call-Id頭,可用于跟蹤和將請求連接到異步響應(yīng)。
取一個屏幕截圖并將其作為PNG文件返回
AWS Lambda的一個限制是它只能返回JSON響應(yīng),盡管這種方法可能有很好的理由,但OpenFaaS允許對函數(shù)進行二進制輸入和響應(yīng)。
讓我們嘗試截取頁面的屏幕快照,并將其捕獲到文件中。
部署一個Grafana儀表板
我們可以使用內(nèi)置的Prometheus UI從函數(shù)中觀察紅色指標,也可以部署Grafana并訪問OpenFaaS儀表板。
參見:OpenFaaS觸發(fā)器
結(jié)束
現(xiàn)在您已經(jīng)擁有了使用Puppeteer部署自動化測試和web抓取代碼所需的工具。由于OpenFaaS可以利用Kubernetes,您可以使用自動伸縮的節(jié)點池和比通?;谠频墓δ墚a(chǎn)品更長的超時。OpenFaaS可以很好地與其他工具合作,比如支持異步調(diào)用的NATS、收集指標的Prometheus以及觀察吞吐量和持續(xù)時間并與團隊中的其他人共享系統(tǒng)狀態(tài)的Grafana。
預(yù)編譯版本的Chrome包括docker-puppeteer和os - Chrome -lambda不會運行在樹莓派或ARM64機器上,但有一個可能,他們可以重新構(gòu)建。如果你想從Raspberry Pi或者ARM64服務(wù)器上快速抓取網(wǎng)頁,你可以考慮其他的選擇,比如scrapy。
最后,我在這里會有一些偏見,但是我發(fā)現(xiàn)讓Puppeteer使用OpenFaaS比使用AWS Lambda要簡單得多,所以我認為您應(yīng)該嘗試一下。