美文网首页我爱编程
node.js使用cheerio制作网络爬虫

node.js使用cheerio制作网络爬虫

作者: yuansc | 来源:发表于2015-09-15 14:43 被阅读12691次

    准备

    • 安装node.js开发环境(略过,不知道的请google);
    • 了解cheerio库,英文好的点这,英文没那么好的点这
    • 熟悉async(非必须),只是我比较喜欢用这个,之前写过一篇博客,大家可以看下
    • 了解node.js HTTP模块

    查看页面结构

    明确数据抓取页

    这一步是为了分析你要抓数据的可行性,说白了就是看查看页面源代码分析其dom节点。在这里我们以58同城的租房栏最为目标数据抓取页。

    分析dom节点

    大家可以看源代码,我们要抓取的数据都是包含在一个一个table标签里面,table下面的每一个tr都是一条目标数据。

    编码

    这里先把代码放上--gist,以便大家可以对照看下面的讲解。
    ok,下面进入最重要的一步,编码
    我们使用的是node.js http get请求;

    获取你要抓取的总页数

    (你总不能抓一页就完事吧,要抓完)

    function getPageNum(callback){
    var options = {
    host: host,
    port: 80,
    path: path,
    headers: {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36'
    }
    };
    var html = ""
    http.get(options,function (res) {
    res.on('data', function (data) {
    html += data;
    });
    res.on('end', function () {
    var $ = cheerio.load(html);
    var pagenum=$('.pager').find('a').length;
    var pager=$('.pager').find('a').eq(pagenum-2).text();
    callback(undefined,pager);
    });
    }).on('error', function (e) {
    callback(e);
    })
    }
    
    

    上面我们定义了一个方法,发送http请求获取总的页数,
    大部分都是http get请求的代码。核心代码:

    var $ = cheerio.load(html);
    var pagenum=$('.pager').find('a').length;
    var pager=$('.pager').find('a').eq(pagenum-2).text();
    

    在这一行里,大家可以查看页面源代码,发现其在 class:pager
    的标签里包含着页数,而其中包含着好多a标签。而总页码数位于倒数第二个a标签中所以在上面我们可以获取总页数。

    抓取数据

    先上代码

    function gettitle(path2,callback){
         var options = {
            host: host,
            port: 80,
            path: path+path2,
            headers: {
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36'
            }
        };
        var html = ""
        http.get(options,function (res) {
            res.on('data', function (data) {
                html += data;
            });
            res.on('end', function () {
                var $ = cheerio.load(html);
                 $('.main').find('table').find('tr').each(function(i,ele){
                    title.push($(this).find('h1').find('a').text().trim());
                 });
                 callback()
     
            });
        }).on('error', function (e) {
            callback(e);
            })
    }
    
    

    从网页的源代码可以看出我们房屋信息的列表去全都包在一个个table的tr中,
    所以我们首先找到其中的table,再选出其中的tr标签,然后对每个tr进行操作,摘出
    其中的房屋题目。

    PS:

    由于这篇文章断断续续写的,所以到后期写的细节方面多有不足,
    对应着我写的博客,和代码相对容易明白一点,但是首要因素是
    明白async 和 http get请求。

    相关文章

      网友评论

        本文标题:node.js使用cheerio制作网络爬虫

        本文链接:https://www.haomeiwen.com/subject/xqlmcttx.html