• 1. shirlyzhang新人分享 ——nodejs运行机制及RSS爬虫实例分享
  • 2. shirlyzhangnodejs是一个平台让Javascript运行在浏览器之外的平台
  • 3. shirlyzhang为什么适合开发服务器端程序呢?
  • 4. shirlyzhang模块机制异步IO,事件轮询机制
  • 5. 模块系统遵循commonJS规范方便的定义和引入1
  • 6. shirlyzhangvar http = require('http');var user = require('./routes/user')得到模块的导出对象module.exports
  • 7. shirlyzhangrequire的一个重要行为就是它缓存了 module.exports的值并且在未来再次 调用require时返回同样的值。 它依据被require文件的绝对路径来进行缓存。
  • 8. shirlyzhang如果你想要你的模块返回不同的值, 你应该导出一个在再次调用时能返回不同值的函数
  • 9. shirlyzhang如文件,网络通信等CoreJavascript中 没有或者不完善的功能 net、 http、fs、stream等 内置封装了很多模块供js调用
  • 10. shirlyzhang
  • 11. shirlyzhang如基于http上的MVC框架--express模块 Web Socket服务--Socket.io模块 HTTP请求调用—Request模块 数据库驱动—Mongoose模块 异步流程控制—Async模块 不断更新的第三方模块
  • 12. 非阻塞模式异步IO与事件轮询机制2
  • 13. shirlyzhangNodejs是单线程的
  • 14. shirlyzhang
  • 15. shirlyzhang好处就是 1)简单 2)高性能,避免了频繁的线程切换开销 3)占用资源小,在大负荷情况下, 对内存占用仍然很低 3)线程安全,没有死锁这些问题
  • 16. shirlyzhang单线程如何处理并发?
  • 17. Node最大的并发量就是1, 但是v8执行js代码的速度非常快, 在调用堆栈执行非常快的情况下, 同一微小的时刻,也无须处理多个请求。
  • 18. 异步IO、回调方式遇到IO、数据库等费时的请求, 会异步执行,不阻塞等待, 而是等它们执行完后通知主线程, 主线程在执行相对应的回调函数,
  • 19. shirlyzhangvar fs = require("fs"); fs.readFile("./testfile", "utf8", function(error, file) {        if (error) throw error;        console.log("我读完文件了!"); }); console.log("我不会被阻塞!");
  • 20. shirlyzhang采用事件轮询机制实现
  • 21. shirlyzhang主线程上运行eventloop线程 运行到某个事件,先注册事件 不停的询问内核这些事件是否已经分发 当事件分发时,对应的回调函数就会被触发 如果没有事件触发,则继续执行其他代码 直到有新事件时,再去执行对应的回调函数
  • 22. shirlyzhang我们可以利用http模块方便的架起 一个服务器监听端口,接收各种请求消息, 传递给置于其中的处理函数。
  • 23. shirlyzhang
  • 24. shirlyzhang我们要考虑的就是有请求过来后, function(request, response){}中应该怎么响应, 怎么根据不同的请求给出相应的response。
  • 25. shirlyzhang你最原始的nodejs服务器程序可能是这样的
  • 26. shirlyzhang
  • 27. shirlyzhang既然nodejs的特色之一是各种第三方模块功能, 那我们可以不用麻烦关注如何路由不同的请求
  • 28. shirlyzhang
  • 29. shirlyzhang这样,我们重点关注的就是 routes内相应的处理逻辑了
  • 30. shirlyzhangNodejs借助事件驱动,非阻塞 I/O 模型 变得轻量和高效,非常适合: 1、io操作多,cpu操作少的场合 2、数据简单,但是数据访问频繁的场合
  • 31. shirlyzhang下面具体分享下使用nodejs做的 抓取rss新闻的网络爬虫程序的逻辑
  • 32. shirlyzhang基于XML标准 一种描述和同步网站内容的格式RSS(简易信息聚合)
  • 33. shirlyzhang
  • 34. shirlyzhang分析要抓取的站点,获取站点的RSS链接 根据链接发起请求 各站点编码格式不一样 GBK,UTF-8等等, 所以需要进行编码 动态解析拉取到的rss文章信息 格式化存入数据库 根据rss文章信息中的文章链接, 请求文章具体内容 得到新闻页面的所有元素 在全文中查找新闻的正文 在正文中找到需要的图片
  • 35. shirlyzhang需要抓取的站点信息放到一个json文件中
  • 36. shirlyzhang
  • 37. shirlyzhangrequest(url,[option]); 这个是可以发送http请求的函数
  • 38. shirlyzhang
  • 39. shirlyzhangreq 需要监听几个状态 response,error。
  • 40. shirlyzhang把非utf8的编码转换成utf8
  • 41. shirlyzhang
  • 42. shirlyzhang.pipe()方法监听res的'data' 、'end'、'error'等事件, 这样转换就可以边接收边进行转换Stream在nodejs中是EventEmitter的实现, 并且有多种实现形式,例如: http responses request fs read write streams tcp sockets
  • 43. shirlyzhang保存文章信息结构
  • 44. shirlyzhang然后可以从存入的文章信息中获取文章url, 拉取文章的具体内容
  • 45. shirlyzhang中文乱码问题解决转换的技巧在于,使用buffer去转换, 把收到的数据全部变成buffer字节数据, 然后再统一转换为GBK
  • 46. shirlyzhang正文截取html文件源码操作的神器 cheerio它能让我像使用jquery一样方便快捷地操作抓取到的源码