nodejs實現爬蟲

  因爲一些緣由,咱們想要獲取某個網站的數據。咱們能夠經過nodejs爬蟲拿到咱們但願的數據。要完成一個爬蟲,主要的步驟分爲:javascript

抓取

  爬蟲,最重要的步驟就是如何把想要的頁面抓取回來。而且可以兼顧時間效率,可以併發的爬取多個頁面。想要獲取目標內容,須要咱們分析頁面結構。html

  一、使用nodejs的request模塊,獲取目標頁面的html代碼。java

  二、使用cheerio模塊對html模塊作處理,拿到須要的數據。node

存儲

  獲取到有價值的數據後,爲了方便咱們的使用能夠把數據保存下。能夠轉換成json文件或者直接存入數據庫。jquery

具體實現

一、初始化一個項目:ajax

$ npm init複製代碼

二、安裝依賴模塊:數據庫

$ npm install express request cheerio --save複製代碼

express用來搭建node服務;express

request相似於ajax的方式獲取一個url裏面的html代碼;npm

cheerio相似於jquery那樣對所獲取的html代碼進行處理。json

三、根目錄建立一個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();複製代碼

四、運行spider.js文件

$ node spider.js複製代碼

  控制檯會輸出抓取成功。這個時候你會發現文件夾裏多了一個名爲baiduData.json的json文件。

相關文章
相關標籤/搜索