美文网首页程序员
node js爬虫,进程死掉不再执行,也不退出指南。

node js爬虫,进程死掉不再执行,也不退出指南。

作者: 臣以君纲 | 来源:发表于2018-12-18 21:52 被阅读0次

最近在用node js编写爬虫的过程中,遇到了一个奇怪的问题,爬虫代码正常执行,但总是中途停止,不再继续执行,也不报错退出,而且发生的时间也很随机,很头疼,

开始分析是爆栈,然而检查代码,,发现基于event loop 的node js到处都是回调,很难爆栈。分析是内存占用过多卡死?定时执行gc,也没有用,,最后终于发现,,竟然是因为请求时未设置超时时间,,导致回调无法执行,,无法进行下一步。

然而node js http模块不支持设置超时时间,只能伪实现一个,话不多说,上代码,,用到了http模块,cheerio模块(用于将爬取到的网页变为类jq访问的文档树),iconv-lite(用于改变网页数据编码,这里有个坑,http.get默认会把网页编码设置为utf-8,如果爬取网页是gbk的,就会乱码),

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


     var req = null
       request_timer = setTimeout(function () { //这里通过定时器伪实现超时设置,20秒没有相应,结束请求,执行回调,重点
           req.abort();
           console.log('Request Timeout.');
       }, 20000);

    req = http.get(url, res => {
           if (res) {
               clearTimeout(request_timer); //如果请求有反应,无论成功失败,清楚定时器
               console.log("准备获取数据")
               var data = [];
               res.on("data", data1 => {// 因为数据分块传输,监听数据块拼接,
                   console.log("数据获取中")
                   data.push(data1)
               })

               res.on("end", data2 => {
                   var res = iconv.decode(Buffer.concat(data), 'gb2312');//通过iconv改变王爷编码,这里根据网页meta标签中设置的编码而设置,如果不设置默认为utf-8,,
                   var $ = cheerio.load(res);//这里是把获取的网页数据转化为类dom树
                   console.log("处理完毕")
                   var text = $('').eq(1).text();  //这里是通过类jq的方式获取网页中想要的数据
               })
           }
       })

       req.on("error", function () { //这里记得要监听错误事件,否则请求出错就会结束进程
           console.log("错误暂停")
       })

相关文章

  • node js爬虫,进程死掉不再执行,也不退出指南。

    最近在用node js编写爬虫的过程中,遇到了一个奇怪的问题,爬虫代码正常执行,但总是中途停止,不再继续执行,也不...

  • Node 学习笔记

    结束进程 有些程序可以自动结束,如果事件循环中没有其他待处理的工作,则 Node.js 进程将自行退出,退出码为 ...

  • Node.js多进程

    Node.js多进程Node.js单线程模式运行的,使用事件处理并发。 exec() 使用子进程的执行命令,缓存子...

  • # webpack学习笔记之十三 - cross-env 使用

    webpack 的执行环境是 node.js 在 node.js 执行环境中,在所有模块里都可以访问到一个全局进程...

  • child_process

    目录 进程 线程 Node.js的进程控制 Node.js的线程控制 进程 Process 场景 notepad....

  • Process.nextTick的用法

    Process对象 提供当前Node进程的信息 1.退出码 0:正常退出 1:发生未捕获错误,5:V8执行错误,8...

  • Node.js 事件机制

    Node.js 事件机制 Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过...

  • Node子进程进阶

    最近在做12306爬虫,刚好遇到了Node子进程的应用场景,不总结不快: Node的child_process模块...

  • Node.js的读书笔记

    书单阅读:《Node.js开发指南》《Node.js入门经典》《Node与Express开发》《Node即学即用....

  • nodejs获取当前路径的3种方法

    1,console.log(process.execPath);//返回启动 Node.js 进程的可执行文件的绝...

网友评论

    本文标题:node js爬虫,进程死掉不再执行,也不退出指南。

    本文链接:https://www.haomeiwen.com/subject/yakrkqtx.html