Node.js网页抓取:一个最简单的http请求客户端示例(request client)


发布者 kris  发布时间 1493871489348
关键字 JS学习  Node.JS 
Node.JS有一个request模块,可以很方便的抓取网页内容。最简单的一个示例:

var request = require('request');

request('http://www.google.com', function (error, response, body) {
 if (!error && response.statusCode == 200) {
   console.log(body);
 }
})

由上例可以看出用request发起一个http请求确实非常简单,不过唯一的问题就是,request模块的第三方依赖比较多,导致这个模块非常地大,要占用好几M的空间。

其实用node.js原生的http模块就可以很方便地写出一个类似的request的功能,只要几十行即可:

var http  = require('http')
var url   = require('url')


var request = function(reqUrl, data, cb, headers) {
  var dataType = typeof data

  if (dataType == 'function') {
    headers = cb
    cb      = data
    rawData = null
  } else if (dataType == 'object') {
    rawData = JSON.stringify(data)
  } else {
    rawData = data
  }

  var urlObj  = url.parse(reqUrl)

  var options = {
      hostname  : urlObj.hostname
    , port      : urlObj.port
    , path      : urlObj.pathname
    , method    : rawData ? 'post' : 'get'
  }

  headers && (options.headers = headers)


  var req = http.request(options, function(res) {
    var receives = []

    if (res.statusCode !== 200) {
      cb && cb(new Error('Request Failed. Status Code: ' + res.statusCode + ' ' + reqUrl))
      return
    }

    res.on('data', function(chunk) {
      receives.push(chunk)
    })

    res.on('end', function() {
      var resData = Buffer.concat(receives).toString()
      try {
        resData = JSON.parse(resData)
      } catch (e) { }

      cb && cb(null, res, resData)
    })
  })

  req.on('error', function(e) {
    cb && cb(e)
  })

  rawData && req.write(rawData)

  req.end()
}


module.exports = request

使用接口与request模块是一样的,比如我们抓取新浪新闻首页的内容

request('http://news.sina.com.cn', function(err, res, data) {
  console.log('geted', data)
})

其次它还支持抓取时附加cookie等header认证信息,如

request('http://news.sina.com.cn', function(err, res, data) {
  console.log('get with cookie', data)
}, { cookie: '_sessionid=1234567890' })

对POST的支持

request('http://news.sina.com.cn', { postdata: 'json' }, function(err, res, data) {
  console.log('get with cookie', data)
}, { cookie: '_sessionid=1234567890' })





回复 (4)
微信扫码 立即评论




 热门文章 - 分享最多
  1. JavaScript使用ES6的Class面向对象继承时 this is not defined 解决方法
  2. Java已快过时?斯坦福大学将JavaScript作为计算机科学入门课
  3. Docker改名Moby:急于商业化陷入品牌更名乱象
  4. JavaScript条形码生成和扫码识别(Barcode scan)开源库
  5. TCP/UDP协议比较:在Node.JS中UDP服务器和客户端通信示例
  6. OnceVI前后端分离的数据可视化报表工具简介
  7. Node.JS通过原型和类继承EventEmitter,实现收发事件的几种方法
  8. 2016 年崛起的 JS 项目
  9. 如何基于SVG矢量图制作一个可填写信息的可视化表单-OnceVI
  10. 周鸿祎:一些程序员没有商业意识,却又很自负,一看就知道不会创业

 相关阅读
  1. JavaScrip字符串模板表达式中的反引号怎么打?
  2. Node.JS用Socket实现FTP Server服务器和Client客户端
  3. Node.JS更改Windows注册表regedit的几种方法
  4. Debian下设置Linux Shell脚本开机自动启动Node.JS进程
  5. Node.JS通过原型和类继承EventEmitter,实现收发事件的几种方法
  6. 可视化Web报表OnceVI中用户输入表单验证与提交
  7. Web报表OnceVI如何制作条形码与打印二维码(Barcode/Qrcode)
  8. 如何基于SVG矢量图制作一个可填写信息的可视化表单-OnceVI
  9. OnceVI报表制作入门—如何将用户的json数据可视化成名片展示
  10. OnceDB支持全文搜索和关系查询的Redis内存数据库:驱动安装及使用教程

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA