OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

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


分享到
分类 JS学习   关键字 Node.JS   发布 kris  1493871489348
注意 转载须保留原文链接,译文链接,作者译者等信息。  
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' })

社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  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. 周鸿祎:一些程序员没有商业意识,却又很自负,一看就知道不会创业
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  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内存数据库:驱动安装及使用教程

 关键字 - Node.JS
  1. 用纯Node.JS弹出Windows系统消息提示框(MessageBox)
  2. 理解Node.js的事件循环(Event Loop)和线程池
  3. Node.JS中如何快速扫描端口并发现局域网内的Web服务器地址(80)
  4. Express入门教程:一个简单的博客
  5. Node.JS循环递归复制文件夹目录及其子文件夹下的所有文件
  6. Oracle发布官方版Node.JS数据库驱动
  7. 为什么你应该抛弃Express的视图渲染引擎
  8. 在OnceIO(Node.JS)中用Redis储存Session
  9. Node.js中的通用基础设计模式
  10. 沃尔玛为什么要采用Node.js

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号