使用Node抓取网页并提取其中的链接


#乱炖


2015-01-10

node版本是v0.10.28。使用了3个第三方库,分别是requesticonv-litecheerio

使用request获取网络内容

# !/usr/bin/env node
var request = require('request');

var options = {
    url: 'http://www.qq.com',
    headers: {
        'User-Agent': 'request'
    }
};

request(options,function(error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
});

能够抓取网页内容,可惜内容乱码(http://www.qq.com编码为gb2312,上述代码所在文件为utf-8编码,而且Node当前貌似也不支持gb2312等编码。)。这里用iconv-lite对其进行转换。

使用iconv-lite对获取的网页进行编码转换

# !/usr/bin/env node
var iconv = require('iconv-lite');
var request = require('request');

iconv.extendNodeEncodings();

var options = {
    url: 'http://www.qq.com',
    encoding: 'gb2312',
    headers: {
        'User-Agent': 'request'
    }
};

request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
    }
);

现在,抓取的网页内容就正常了。然后使用cheerio提取链接。

使用cheerio提取链接

# !/usr/bin/env node
var iconv = require('iconv-lite');
var request = require('request');
var cheerio = require('cheerio');

iconv.extendNodeEncodings();

var options = {
    url: 'http://www.qq.com',
    encoding: 'gb2312',
    headers: {
        'User-Agent': 'request'
    }
};

request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            $ = cheerio.load(body);
            console.log($('a').length);
            $('a').each(function(i, elem) {
                title = $(this).text();
                url = $(this).attr('href');
                if (typeof(title) != 'undefined' && typeof(url) != 'undefined') {
                    console.log(title.trim());
                    console.log(url);
                }
            });
        }
    }
);

对链接的处理可以更细致一些。比如有一些url是javascript:void(0),甚至有的是空串。



( 本文完 )