使用sync-request和cheerio写爬虫

node.js自带的http模块是异步获取网页内容的,不过我们可以到npm上去搜索同步的http模块。sync-request就是其中一种。

首先,安装sync-request包:

npm install sync-request

它的使用方法是:

var request = require('sync-request');
var html = request(method, url, options).getBody().toString();

然后我们需要一个解析html树的工具。jsdom可以用,但是它实在是太大,我们可以用cheerio,它提供了类似jquery的api,更加便捷。

npm install cheerio

之后:

var cheerio = require('cheerio');
var $ = cheerio.load(html);

下面是抓取菜鸟教程(runoob.com)单部教程的一个例子:

var cheerio = require('cheerio');
var request = require('sync-request');
var fs = require('fs');

var ofile = fs.openSync('out.html', 'w');

var url = 'http://www.runoob.com/html/html-tutorial.html';
var html = request('GET', url).getBody().toString();

var toc = getToc(html);
for(var i in toc) {
    var url = toc[i];
    console.log('page: ' + url);
    html = request('GET', url).getBody().toString();
    var content = getContent(html);
    fs.writeSync(ofile, content, null, 'utf-8');
}

fs.closeSync(ofile);
console.log('Done..');


function getToc(html)  {

    var $ = cheerio.load(html);

    var $list = $('#leftcolumn').find('a');
    var res = [];
    for(var i = 0; i < $list.length; i++)
    {
        var url = $list.eq(i).attr('href');
        res.push('http://www.runoob.com/' + url);
    }
    return res;
}


function getContent(html) {
    var $ = cheerio.load(html);
    var content = $('#content').html();
    return content;
}
posted @ 2016-01-22 14:31  绝不原创的飞龙  阅读(11)  评论(0编辑  收藏  举报  来源