nodejs puppeteer生產實踐閉坑指南

puppeteer是谷歌出的一個用於操控無頭瀏覽器的框架,用來做爬蟲的頁面下載模塊是非常不錯的選擇。
如果你寫的是針對某一網站的專用爬蟲,那麼完全使用nodejs實現就行,如果你寫的是爬取所有類型網站的通用爬蟲,那麼我建議你用一個熟悉的語言寫爬蟲引擎,Nodejs僅僅作爲頁面下載器。這和nodejs底層的實現和其特性有關。

使用方法

將puppeteer放到koa中,從而使得Node提供頁面下載的接口,實現模塊間的鬆耦合

部署後的問題

內存問題

對於web2.0頁面下載,每個頁面都會加載所有的內容,會導致一個連接佔用大量的內存。對此,可以針對內存問題做以下優化

  • 減少支持的最大連接數
  • 對頁面中png/jpg/gif等請求進行攔截中止
  • 對puppeteer的Page限制跳轉最長等待時間,避免出現一直等待
socket hang up (連接被掛斷)

nodejs服務似乎會產生內存泄漏的問題(目前沒有找到原因),所以隨着任務的增多,內存似乎會產生堆積,造成任務響應整體變慢。所以此時容易造成大部分頁面都有比較長的等待時間,此時也可以利用上文中的 對puppeteer的Page限制跳轉最長等待時間,避免出現一直等待
。同時需要定期對頁面下載模塊的任務做重啓的操作。

由於不清楚nodejs和npm如何實現定期重啓任務的功能,所以針對該服務,可以使用註冊該服務到systemctl中的方法,利用systemctl管理工具來管理服務的打開關閉。然後利用crontab來做定期重啓的服務
具體實踐如下:

# the puppeteer of node service
[Unit]
Description=puppeteer

[Service]
TimeoutStartSec=180
TimeoutStopSec=30

# exec
ExecStart=/usr/bin/node bin/www
ExecStop=/usr/bin/pkill node
# log
StandardOutput=syslog
StandardError=syslog

cron中設置兩小時重啓一次

1 */2 * * * /bin/systemctl restart puppeteer.service

這樣就可以簡單粗暴的解決內存泄漏帶來的性能降低的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章