天天看點

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      
1 */2 * * * /bin/systemctl restart puppeteer.service