前端之 —— node.js摸爬打滚之路(一)

安装:

window下的安装,node.js直接上官网下载:https://nodejs.org/en/

选择LTS,也就是版本号比较低的稳定版,下载下来后运行下载的文件进行安装;

通过win+R打开cmd命令行:执行以下命令安装淘宝镜像:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

学习express框架:

全局安装express:

cnpm install express -g

建立新文件夹sesson1并进入sesson1:

mkdir sesson1 && cd sesson1

使用npm生成package.json文件:(加-y 可以免去确认)

npm init -y

安装utility:

cnpm install utility --save

新建app.js文件,复制以下内容:

var express = require(‘express‘)  //引入express模块并赋给变量express
var utility = require(‘utility‘) //引入utility库
var app = express() //加括号表示将express实例化,并赋给变量app

//app.get是express实例的一个方法,常用方法:get、post、put/patch、delete;
//第一个参数是路径,第二个参数是一个回调函数,函数会接收到两个对象,分别是 request 和 response,简写成:req 和 res;
// req 中包含了浏览器传来的各种信息,query,body,headers等都可以通过 req 对象访问。
// res 对象,一般通过它向浏览器输出信息。

app.get(‘/‘,function(rep,res){var q = req.query.q
  var md5Value = utility.md5(q)
  res.send(md5Value)
}).listen(3000,function(rep,res){
  console.log(‘app is running at port 3000‘)
})

cmd执行app.js:

node app.js

浏览器输入:http://locallhost:3000/?q=Hello World ,出现Hello World字符串转md5的值 : 0a4d55a8d778e5022fab701977c5d840bbc486d0

简单爬虫的实现:

mkdir lesson2 && cd lesson2
npm init -y
cnpm install cheerio --save-dev
cnpm intsall bluebird --save

新建app.js文件,复制以下内容:

var http = require(‘http‘)
var express = require(‘express‘)
var cheerio = require(‘cheerio‘)
var Promise = require(‘bluebird‘)
var app = express()
var fetchCourseArray = [],pageArray =[]

function getPageAsync(url){
  return new Promise(function(resolve,reject){
      console.log(‘正在爬取...‘+url)

      http.get(url,function(res){
      var html = ‘‘
      res.on(‘data‘,function(data){
          html += data
      })
      res.on(‘end‘,function(){
          resolve(html)
      })
    }).on(‘error‘,function(){
        reject(e)
        console.log(‘任何时候,都不是代码的错!‘)
    })
  })
}

pageArray.push(‘http://coderschool.cn/1853.html‘)
pageArray.forEach(function(value,index){
    fetchCourseArray.push(getPageAsync(pageArray[index]))
})

Promise
    .all(fetchCourseArray)
    .then(function(pagesArr){
        pagesArr.forEach(function(html){
            var $ = cheerio.load(html)
            var a = $(‘.post-1853 p a‘)
            itemArr = []
            a.each(function(){
              itemArr.push({
                    title:$(this).text(),
                    href:$(this).attr(‘href‘)
              })
            })
            itemArr.forEach(function(item){
                console.log(item.title +‘: ‘+item.href)
            })
        })
    })

app.get(‘/‘, function(req,res){
    res.send(itemArr)
}).listen(3000,function(){
    console.log(‘app is listening at port 3000‘)
})

cmd执行:

node app.js

页面输出itemArr数组,cmd命令行打印爬取页面的指定内容。

爬虫并发抓取:

var cheerio = require(‘cheerio‘)
var eventproxy = require(‘eventproxy‘)
var superagent = require(‘superagent‘)
var url = require(‘url‘)

var cnodeUrl = ‘https://cnodejs.org/‘

superagent.get(cnodeUrl)
    .end(function(err, res) {
        if (err) {
          return console.error(err)
        }
        topicUrls = []
        var $ = cheerio.load(res.text)

        $(‘#topic_list .topic_title‘).each(function(idx, element){
            var $element = $(element)
            var href = url.resolve(cnodeUrl,$element.attr(‘href‘))
            topicUrls.push(href)
        })

        var ep = new eventproxy()
        ep.after(‘topic_html‘,topicUrls.length,function(topics){
            topics = topics.map(function(topicPair){
                var topicUrl = topicPair.topicUrl
                var topicHtml = topicPair.text
                var $ = cheerio.load(topicHtml)
                return ({
                    title: $(‘.topic_full_title‘).text().trim(),
                    href: topicUrl,
                    comment1: $(‘.reply_content‘).eq(0).text().trim(),
                    author1:$(‘.user_name a‘).text().trim(),
                    score1:$(‘.floor .big‘).text().trim()
                })
            })

            console.log(‘final:‘)
            console.log(topics)
        })

        topicUrls.forEach(function(topicUrl){
            superagent.get(topicUrl)
                .end(function(err,res){
                    console.log(‘fetch ‘ + topicUrl + ‘ successful‘)
                    ep.emit(‘topic_html‘,{topicUrl: topicUrl, text: res.text})
                })
        })
    })

cmd执行:

node app.js

cmd命令行打印并发爬取多个页面的指定内容。

控制爬虫并发数量:

var cheerio = require(‘cheerio‘)
var superagent = require(‘superagent‘)
var url = require(‘url‘)
var async = require(‘async‘)

var cnodeUrl = ‘https://cnodejs.org/‘

superagent.get(cnodeUrl)
    .end(function(err, res) {
        if (err) {
          return console.error(err)
        }
        var topicUrls = []
        var $ = cheerio.load(res.text)

        $(‘#topic_list .topic_title‘).each(function(idx, element){
            var $element = $(element)
            var href = url.resolve(cnodeUrl,$element.attr(‘href‘))
            topicUrls.push(href)
        })

        var concurrencyCount = 0
        var itemArr = []
        var fetchUrl = function(topicUrl, callback){
            var delay = parseInt((Math.random() * 10000000) % 2000, 10)
            concurrencyCount ++
            console.log(‘并发数:‘+ concurrencyCount,‘正在抓取:‘,topicUrl,‘耗时:‘+delay + ‘ms‘)
            superagent.get(topicUrl)
                .end(function(err,res){
                    var $ = cheerio.load(res.text)
                    var topics = {
                        title: $(‘.topic_full_title‘).text().trim(),
                        href: topicUrl,
                        comment1: $(‘.reply_content‘).eq(0).text().trim(),
                        author1:$(‘.user_name a‘).text().trim(),
                        score1:$(‘.floor .big‘).text().trim()
                    }
                    itemArr.push(topics)
                })
            setTimeout(function(){
                concurrencyCount --
                callback(null,topicUrl + ‘html content‘)
            },delay)
        }

        async.mapLimit(topicUrls,5,
            function(topicUrl, callback){
                fetchUrl(topicUrl, callback)
            },
            function(err, result){
                console.log(‘final:‘)
                console.log(result)
                console.log(itemArr)
            })
    })

cmd执行:

node app1.js

cmd命令行打印爬取指定并发数的多个页面的指定内容。

非教程,只是自己学习的记录,当然也希望可以帮到您。

参考资料:

时间: 2024-08-05 17:18:04

前端之 —— node.js摸爬打滚之路(一)的相关文章

前端之 —— node.js摸爬打滚之路(二)

这篇主要学习: 测试框架mocha; 断言库:should; 测试率覆盖工具 istanbul; 创建并进入lesson3: mkdir lesson3 && lesson3 创建main.js并编写测试函数: var fibonacci = function(n) { if(typeof n !== 'number'){ throw new Error('n should be a Number') } if(n < 0){ throw new Error('n should &g

Node.js爬虫-爬取慕课网课程信息

第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让我们方便的操作HTML,就像是用jQ一样 开始前,记得 npm install cheerio 为了能够并发的进行爬取,用到了Promise对象 //接受一个url爬取整个网页,返回一个Promise对象 function getPageAsync(url){ return new Promise(

Node.js/Python爬取网上漫画

某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. 经过一段时间的研究还是有所收获:成功在风之动漫网站上抓取了<火星异种>,以及在腾讯动漫上抓取了<海贼王>.一般来说,抓取网页内容有两种形式:一是静态资源,即网站内容在第一时间就全部呈现在网页上:另一种是动态资源,即网站内容随后通过用户交互,如:操作滚动条等,异步的更新.对于第一种形式

WebSocket 一场Web 通讯革命悄然来临——Node.js摸石头系列之五

转自: http://www.cnblogs.com/hsxixi/archive/2011/12/24/2300641.html 从这回开始,我们来搭建一个简单的聊天室.因为 http 协议是无状态的,搭建聊天室这样的事从来都让人觉得疙疙瘩瘩的不是那么顺理成章.如果不使用 flash.applet 等浏览器插件的话,我们需要定期轮询服务器来获取大家的聊天信息.这造成了一定的延迟和大量的网络通讯. 不过,随着 HTML5 的浮出水面,这一情况有望彻底改观了.在 HTML5 的众多特性中,有一个总

Centos6.9安装Node.js+npm爬坑

Node.js选择 1.下载 wget https://nodejs.org/dist/v8.4.0/node-v8.4.0-linux-x86.tar.gz 2.解压 tar -xJf node-v8.4.0-linux-x86.tar.xz 3. 移到通用的软件安装目录 /opt/ mv node-v6.9.2-linux-x64 /opt/ 4. 在系统命令中建立npm 和 node 命令的软连接 ln -s /opt/node-v6.9.2-linux-x64/bin/node /usr

前端(Node.js)(4)-- 使用loopback快速搭建用户系统

1.loopback.io 2.模型系统与数据源(datasources) 3.使用Github账号登陆 4.邮箱验证 原文地址:https://www.cnblogs.com/foreverlin/p/10150651.html

使用Node.js实现简单的网络爬取

由于最近要实现一个爬取H5游戏的代理服务器,隧看到这么一篇不错的文章(http://blog.miguelgrinberg.com/post/easy-web-scraping-with-nodejs),加之最近在学习Node.js,所以就准备翻译出来加深一下印象. 转载请注明来源:(www.cnblogs.com/xdxer )   在这篇文章中,我将会向大家展示如何用JavaScript配合Node.js写一个网络爬取的脚本. 网络抓取工具 在大部分情况下,一个网络抓取的脚本只需要一种方法去

使用node爬虫,爬取指定排名网站的JS引用库

前期准备 本爬虫将从网站爬取排名前几的网站,具体前几名可以具体设置,并分别爬取他们的主页,检查是否引用特定库. github地址 所用到的node主要模块 express 不用多说 request http模块 cheerio 运行在服务器端的jQuery node-inspector node调试模块 node-dev 修改文件后自动重启app 关于调试Node 在任意一个文件夹,执行node-inspector,通过打开特定页面,在页面上进行调试,然后运行app,使用node-dev app

使用 node.js 开发前端打包程序 ---转载

我们在做前端开发的时候经常会在部署上线的时候做程序的打包和合并,我们接下来就会对如何使用 node.js 开发前端打包程序做非常深入的讲解,希望能够帮到有需要的同学. 我们现在做前端开发更多的是多人共同协作开发,每个人负责不同的模块,便于开发和调试.这样就导致我们最后部署上线的时候需要把所有人开发的模块进行合并,生成单个或多个文件上线.如果手动合并的话肯定是费时又费力,而且非常容易出错,所以我们一般都是通过一些工具来实现自动合并的功能. 打包程序的原理非常简单,入口文件->寻找依赖关系->替换