前端开发Node js 抓取极客学院所有Wiki 并生成txt

前端开发经理招聘
海晏web前端开发招聘
合肥前端开发招聘信息

抓取后按分类生成文件夹 , 文件夹下生成txt , 只抓取到每篇文章的链接 (因为内容太过庞大),
ps:需要先安装cheerio 第三方模块 (npm install cheerio)

首先引用模块 :
javascript 代码

var http = require(‘http’) // http 模块
var cheerio = require(‘cheerio’) //html 解析
var fs = require(‘fs’) // fs 模块

然后创建一个总目录
javascript 代码

fs.mkdirSync(‘./极客学院Wiki/’) //同步模式创建”极客学院Wiki”目录,用来存放所有wiki。
console.log(‘创建”极客学院Wiki”目录成功。’)

接着抓取http://wiki.jikexueyuan.com/ , 获取所有分类栏目的标题和链接 , 为每个栏目都创建一个对应的文件夹 , 接着调用 getWikipage() 方法查看有没有分页的内容。
javascript 代码

http.get(‘http://wiki.jikexueyuan.com/’, function(res) {
    var html
    res.setEncoding(‘utf8’)
    res.on(‘data’, function(data) {
        html += data
    })
    res.on(‘end’, function() {
        var $ = cheerio.load(html)
        var list = $(‘#jdropdown li’)
        list.each(function(i) {
            var Title = $(this)
                .find(‘.hd’)
                .children(‘a’)
                .text()
            var Href =
                ‘http://wiki.jikexueyuan.com/’ +
                $(this)
                    .find(‘.hd’)
                    .children(‘a’)
                    .attr(‘href’)
            fs.mkdir(‘./极客学院Wiki/’ + Title + ‘/’, function(err) {
                if (err) {
                    return console.error(err)
                }
                console.log(“子目录'” + Title + “‘创建成功。”)
                getWikipage(Href, ‘./极客学院Wiki/’ + Title + ‘/’)
            })
        })
    })
})

getWikipage()方法:先查看栏目下有没有分页 , 有则抓取每个页面 , 无则抓取当前页面 (使用getWikiChapter()方法抓取)

javascript 代码

function getWikipage(url, path) {
    http.get(url, function(res) {
        var html
        res.setEncoding(‘utf8’)
        res.on(‘data’, function(data) {
            html += data
        })
        res.on(‘end’, function() {
            var $ = cheerio.load(html)
            if ($(‘#page-nav’).text() != ”) {
                //抓取分页
                var page = $(‘#page-nav’).find(‘a’).length – 2
                for (var i = 1; i <= page; i++) {
                    getWikiChapter(url + ‘?page=’ + i, path)
                }
            } else {
                getWikiChapter(url, path)
            }
        })
    })
}

getWikiChapter() 方法 (抓取页面下的文章列表,获取每篇文章的链接、介绍、标题 , 最后调用newTxt() 创建txt文件)

javascript 代码

function getWikiChapter(url, path) {
    http.get(url, function(res) {
        var html
        res.setEncoding(‘utf8’)
        res.on(‘data’, function(data) {
            html += data
        })
        res.on(‘end’, function() {
            var $ = cheerio.load(html)
            var wikilist = $(‘.thumbnail .border li’)
            wikilist.each(function(i) {
                var wikiTitle = $(this)
                    .find(‘h4’)
                    .text()
                var wikiContent = $(this)
                    .find(‘.desc’)
                    .children(‘a’)
                    .text()
                var wikiHref = $(this)
                    .find(‘.desc’)
                    .children(‘a’)
                    .attr(‘href’)
                var TxtContent =
                    ‘【wiki介绍】:\r\n’ +
                    wikiContent +
                    ‘\r\n【链接】:\r\n’ +
                    wikiHref +
                    ”
                newTxt(wikiTitle, TxtContent, path)
            })
        })
    })
}

newTxt() 方法 创建txt。
javascript 代码

function newTxt(Title, Content, path) {
    fs.writeFile(path + Title + ‘.txt’, Content, function(err) {
        if (err) {
            return console.log(err)
        }
        console.log(‘创建 “‘ + Title + ‘.txt” 成功!’)
    })
}

完整代码: 写完发现如果要接着抓取 , 那我得写出无数回调 , 感觉特麻烦 有没有什么方法解决~?
javascript 代码

var http = require(‘http’) // http 模块
var cheerio = require(‘cheerio’) //html 解析
var fs = require(‘fs’) // fs 模块
fs.mkdirSync(‘./极客学院Wiki/’) //同步模式创建”极客学院Wiki”目录,用来存放所有wiki。
console.log(‘创建”极客学院Wiki”目录成功。’)
http.get(‘http://wiki.jikexueyuan.com/’, function(res) {
    var html
    res.setEncoding(‘utf8’)
    res.on(‘data’, function(data) {
        html += data
    })
    res.on(‘end’, function() {
        var $ = cheerio.load(html)
        var list = $(‘#jdropdown li’)
        list.each(function(i) {
            var Title = $(this)
                .find(‘.hd’)
                .children(‘a’)
                .text()
            var Href =
                ‘http://wiki.jikexueyuan.com/’ +
                $(this)
                    .find(‘.hd’)
                    .children(‘a’)
                    .attr(‘href’)
            fs.mkdir(‘./极客学院Wiki/’ + Title + ‘/’, function(err) {
                if (err) {
                    return console.error(err)
                }
                console.log(“子目录'” + Title + “‘创建成功。”)
                getWikipage(Href, ‘./极客学院Wiki/’ + Title + ‘/’)
            })
        })
    })
})
function getWikipage(url, path) {
    http.get(url, function(res) {
        var html
        res.setEncoding(‘utf8’)
        res.on(‘data’, function(data) {
            html += data
        })
        res.on(‘end’, function() {
            var $ = cheerio.load(html)
            if ($(‘#page-nav’).text() != ”) {
                //抓取分页
                var page = $(‘#page-nav’).find(‘a’).length – 2
                for (var i = 1; i <= page; i++) {
                    getWikiChapter(url + ‘?page=’ + i, path)
                }
            } else {
                getWikiChapter(url, path)
            }
        })
    })
}
function getWikiChapter(url, path) {
    http.get(url, function(res) {
        var html
        res.setEncoding(‘utf8’)
        res.on(‘data’, function(data) {
            html += data
        })
        res.on(‘end’, function() {
            var $ = cheerio.load(html)
            var wikilist = $(‘.thumbnail .border li’)
            wikilist.each(function(i) {
                var wikiTitle = $(this)
                    .find(‘h4’)
                    .text()
                var wikiContent = $(this)
                    .find(‘.desc’)
                    .children(‘a’)
                    .text()
                var wikiHref = $(this)
                    .find(‘.desc’)
                    .children(‘a’)
                    .attr(‘href’)
                var TxtContent =
                    ‘【wiki介绍】:\r\n’ +
                    wikiContent +
                    ‘\r\n【链接】:\r\n’ +
                    wikiHref +
                    ”
                newTxt(wikiTitle, TxtContent, path)
            })
        })
    })
}
function newTxt(Title, Content, path) {
    fs.writeFile(path + Title + ‘.txt’, Content, function(err) {
        if (err) {
            return console.log(err)
        }
        console.log(‘创建 “‘ + Title + ‘.txt” 成功!’)
    })
}
前端开发招聘焦点科技
web前端开发华为招聘
前端开发2017招聘
» 本文来自:前端开发者 » 《前端开发Node js 抓取极客学院所有Wiki 并生成txt》
» 本文链接地址:https://www.rokub.com/6167.html
» 您也可以订阅本站:https://www.rokub.com
赞(0)
64K

评论 抢沙发

评论前必须登录!