node js爬蟲(chóng),進(jìn)程死掉不再執(zhí)行,也不退出指南。

最近在用node js編寫(xiě)爬蟲(chóng)的過(guò)程中,遇到了一個(gè)奇怪的問(wèn)題,爬蟲(chóng)代碼正常執(zhí)行,但總是中途停止,不再繼續(xù)執(zhí)行,也不報(bào)錯(cuò)退出,而且發(fā)生的時(shí)間也很隨機(jī),很頭疼,

開(kāi)始分析是爆棧,然而檢查代碼,,發(fā)現(xiàn)基于event loop 的node js到處都是回調(diào),很難爆棧。分析是內(nèi)存占用過(guò)多卡死?定時(shí)執(zhí)行g(shù)c,也沒(méi)有用,,最后終于發(fā)現(xiàn),,竟然是因?yàn)檎?qǐng)求時(shí)未設(shè)置超時(shí)時(shí)間,,導(dǎo)致回調(diào)無(wú)法執(zhí)行,,無(wú)法進(jìn)行下一步。

然而node js http模塊不支持設(shè)置超時(shí)時(shí)間,只能偽實(shí)現(xiàn)一個(gè),話不多說(shuō),上代碼,,用到了http模塊,cheerio模塊(用于將爬取到的網(wǎng)頁(yè)變?yōu)轭?lèi)jq訪問(wèn)的文檔樹(shù)),iconv-lite(用于改變網(wǎng)頁(yè)數(shù)據(jù)編碼,這里有個(gè)坑,http.get默認(rèn)會(huì)把網(wǎng)頁(yè)編碼設(shè)置為utf-8,如果爬取網(wǎng)頁(yè)是gbk的,就會(huì)亂碼),

const http = require("http");
const fs = require("fs");
const cheerio = require("cheerio");
const iconv = require('iconv-lite');


     var req = null
       request_timer = setTimeout(function () { //這里通過(guò)定時(shí)器偽實(shí)現(xiàn)超時(shí)設(shè)置,20秒沒(méi)有相應(yīng),結(jié)束請(qǐng)求,執(zhí)行回調(diào),重點(diǎn)
           req.abort();
           console.log('Request Timeout.');
       }, 20000);

    req = http.get(url, res => {
           if (res) {
               clearTimeout(request_timer); //如果請(qǐng)求有反應(yīng),無(wú)論成功失敗,清楚定時(shí)器
               console.log("準(zhǔn)備獲取數(shù)據(jù)")
               var data = [];
               res.on("data", data1 => {// 因?yàn)閿?shù)據(jù)分塊傳輸,監(jiān)聽(tīng)數(shù)據(jù)塊拼接,
                   console.log("數(shù)據(jù)獲取中")
                   data.push(data1)
               })

               res.on("end", data2 => {
                   var res = iconv.decode(Buffer.concat(data), 'gb2312');//通過(guò)iconv改變王爺編碼,這里根據(jù)網(wǎng)頁(yè)meta標(biāo)簽中設(shè)置的編碼而設(shè)置,如果不設(shè)置默認(rèn)為utf-8,,
                   var $ = cheerio.load(res);//這里是把獲取的網(wǎng)頁(yè)數(shù)據(jù)轉(zhuǎn)化為類(lèi)dom樹(shù)
                   console.log("處理完畢")
                   var text = $('').eq(1).text();  //這里是通過(guò)類(lèi)jq的方式獲取網(wǎng)頁(yè)中想要的數(shù)據(jù)
               })
           }
       })

       req.on("error", function () { //這里記得要監(jiān)聽(tīng)錯(cuò)誤事件,否則請(qǐng)求出錯(cuò)就會(huì)結(jié)束進(jìn)程
           console.log("錯(cuò)誤暫停")
       })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,815評(píng)論 1 45
  • Node.js第一天 1. 初識(shí)Node.js 1.1 Node.js是什么 Node.js? is a Java...
    再見(jiàn)天才閱讀 4,898評(píng)論 1 24
  • 來(lái)到空中花園玩,苗苗喜歡玩這里的隧道,窄窄的在河邊的一天石子路,河邊有個(gè)圍欄也是破破爛爛的,腳下是鵝卵石鋪的路,被...
    靜靜心晴閱讀 234評(píng)論 0 1
  • 周六,也就是昨天,又做了故事會(huì)。 這個(gè)過(guò)程很“坎坷”,之所以這么說(shuō),是因?yàn)榻M織準(zhǔn)備的過(guò)程中,出現(xiàn)了一些緊急情況,比...
    木木sani閱讀 236評(píng)論 0 0
  • 沒(méi)想到,那么快就和胖胖扯證了,雖說(shuō)是為了買(mǎi)房。現(xiàn)在,我們即將有個(gè)房子,需要花好多錢(qián)買(mǎi)電器家具,每個(gè)月要還貸,賺的錢(qián)...
    詩(shī)和奶茶閱讀 222評(píng)論 1 0

友情鏈接更多精彩內(nèi)容