node-day5 簡易小爬蟲 superagent+cheerio 的使用

// 模塊導入
var express = require('express');//導入express 模塊
// const utility = require('utility');//提供了不少經常使用且比較雜的輔助方法,如 utility.md5() md5算法,用來加密
var eventproxy = require('eventproxy');
var superagent = require('superagent');//是個 http 方面的庫,能夠發起 get 或 post 請求。
var cheerio = require('cheerio'); //Node.js 版的 jquery,用來從網頁中以 css selector 取數據,使用方式跟 jquery 同樣同樣的。
var url = require("url"); //node.js自帶
var app = express();//建立一個express實例 這樣app上就有express中的各類方法了。如 get post put delete
app.get('/',function(req,res){
    superagent.get('https://cnodejs.org/').end(function(error,sres){
        if(error){
            return next(error);
        }
        // sres.text 存放着爬取的html內容
        var  $ = cheerio.load(sres.text);//將它傳給 cheerio.load 以後 就能夠獲得一個實現了 jquery 接口的變量,咱們習慣性地將它命名爲 `$`
        var  jsonObj = [];
        var urlList = [];
        var baseUrl = "https://cnodejs.org/";
        $('#topic_list  .cell').each(function(index,item){
            item = $(item);
            var name = item.find('.user_avatar img').attr('title')
            var href = item.find(".topic_title").attr("href");
            var title = item.find(".topic_title").attr("title");
            href = url.resolve(baseUrl,href);//拼接完整的url地址
            urlList.push(href);
        })
        var eq = new eventproxy();
        eq.after('myEvent',urlList.length,function(data){
            //data是一個數組,當eq 監聽的全部myEvent事件都完成了後開始往下走↓↓,這個時候data已是一個把每次事件執行完後傳遞過來的數據拼接好的數組,因此 這個after 至關於一個計數器,記數次數爲第二個參數
            // res.send(data);
            data = data.map(function(item){
                var $ = cheerio.load(item);//把返回的數據變成能夠用選擇器選擇的對象
                return {
                    title: $('.topic_full_title').text().trim(),//獲取title
                    comment1: $('.reply_content').eq(0).text().trim() //獲取內容
                 }
            })
            res.send(data);
        });
        urlList.forEach(function(items){
            superagent.get(items).end(function(err,res){
                // console.log(res);
                eq.emit('myEvent',res.body)//告訴eq myEvent 事件作完了,而且把sres.text傳遞過去。
            })
        })
    })
})

// 監聽端口
app.listen(3000,function(){
    console.log('成功');
})

爬蟲爬一下。css

相關文章
相關標籤/搜索