nodejs实现爬虫

  由于一些原因,我们想要获取某个网站的数据。我们可以通过nodejs爬虫拿到我们希望的数据。要完成一个爬虫,主要的步骤分为:

抓取

  爬虫,最重要的步骤就是如何把想要的页面抓取回来。并且能够兼顾时间效率,能够并发的爬取多个页面。想要获取目标内容,需要我们分析页面结构。

  1、使用nodejs的request模块,获取目标页面的html代码。

  2、使用cheerio模块对html模块做处理,拿到需要的数据。

存储

  获取到有价值的数据后,为了方便我们的使用可以把数据保存下。可以转换成json文件或者直接存入数据库。

具体实现

1、初始化一个项目:

$ npm init复制代码

2、安装依赖模块:

$ npm install express request cheerio --save复制代码

express用来搭建node服务;

request类似于ajax的方式获取一个url里面的html代码;

cheerio类似于jquery那样对所获取的html代码进行处理。

3、根目录创建一个spider.js

var express = require('express'),
    app = express(),
    request = require('request'),
    cheerio = require('cheerio'),   
    fs = require('fs');

var fetchData = [];
function fetchBrand(){      
    request('http://waimai.baidu.com/waimai/shop/1434741117', function(err, res, body) {
        if (err || res.statusCode != 200) {
            console.log(err);
            console.log('爬取失败');            
            return false;
        }   
        var $ = cheerio.load(body, { decodeEntities: false });//解决了乱码的问题
        var curBrands = $('.list-wrap');
        for(var i = 0;i < curBrands.length; i++){
            var obj = {
                name: curBrands.eq(i).find('.list-status .title').text(),               
                sub: []
            }           
            fetchData.push(obj);
            var curSeries = curBrands.eq(i).find('.list-item');
            for (var j = 0;j < curSeries.length; j++) {
                var obj = {
                    imgpath:curSeries.eq(j).find('.bg-img').attr('style').substring(curSeries.eq(j).find('.bg-img').attr('style').indexOf('http'), curSeries.eq(j).find('.bg-img').attr('style').indexOf(')')),
                    name: curSeries.eq(j).find('h3').text(),    
                    recommend: curSeries.eq(j).find('.divider').prev().text(),
                    sale: curSeries.eq(j).find('.divider').next().text(),
                    stock: curSeries.eq(j).find('.stock-count').text(),
                    saPrice: curSeries.eq(j).find('span strong').text(),
                    orPrice: curSeries.eq(j).find('del strong').text()
                }
                fetchData[fetchData.length - 1].sub.push(obj);              
            }           
        }
        var t = JSON.stringify(fetchData);
        fs.writeFileSync('baiduData.json', t);
    })  
}

fetchBrand();复制代码

4、运行spider.js文件

$ node spider.js复制代码

  控制台会输出抓取成功。这个时候你会发现文件夹里多了一个名为baiduData.json的json文件。

你可能感兴趣的:(爬虫,json,数据库)