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
這樣就可以簡單粗暴的解決內存泄漏帶來的性能降低的問題