nodejsを使って、蘇州と上海のネットの職務情報を取得します.

12305 ワード

最近仕事を探し始めました.蘇州で何軒か会っても結果がなくてとても悲しいです.フックでは都市蘇州のキーワードによって検索します.NETは全部で80ぐらいの職です.給料を使って濾過しますと、ほとんど投げられないです.それに、最近の蘇州の住宅価格はぐずぐずしていて、住宅ローンの圧力もとても大きいので、上海に行きたいです.暇な時に小さな爬虫類を書いて、蘇州と上海のNETのポストの情報を下に登って、簡単に比較しました.
はい、弟が得意です.NETはどうしてnodejsを使いますか?先日、ある会社がチャンスを与えてくれたので、私はトレーナーに使いましたが、その後も風呂に入りました.でも、二泊で書き終わりました.ちょうど学んで、コードの醜さは軽く噴きます!
一:どうやって指切りのデータを取るか?
これはとても简単です.正规で分析するつもりでしたが、ajaxのインターフェースをチェックして、直接httpでアクセスできます.神器ChromeのF 12を開けて見ればわかる.
これはnodejsでページ別要求をシミュレートするコードです.
var getData = function (kd,city,pn) {
    var mongo = require('./mongo');
    var http = require('http');
    var queryString = require('querystring');

    var postData=queryString.stringify({
        'pn':pn,
        'kd':kd,
        'first':false
    });

    var options = {
        hostname:'www.lagou.com',
        method:'POST',
        path:'/jobs/positionAjax.json?px=default&city='+city,
        headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postData.length
        }
    };
    
    var postResult = '';
    
    var req = http.request(options,(res)=>{
        console.log(`STATUS:${res.statusCode}`);
        res.setEncoding('utf8');
        res.on('data',(chunk)=>{
            postResult+=chunk;
        }); 
        res.on('end',()=>{
            console.log(`RESULT:${postResult}`);
            var jsonObj =JSON.parse(postResult);
            //insert into db
            jsonObj.content.result.forEach((item)=>{
                var salary = item.salary;
                //  3k-6k,    
                var arr = salary.split('-');
                var min = arr[0].substring(0,arr[0].indexOf('k'));
                var max = arr.length>1? arr[1].substring(0,arr[1].indexOf('k')):min;
                item.salaryMin = parseInt(min);
                item.salaryMax = parseInt(max);
                
                mongo.save(city,item);
            });
            if(jsonObj.content.hasNextPage&&jsonObj.content.totalPageCount>pn){
                getData(kd,city,pn+1);
            }
        });
        req.on('error',(e)=>{
            console.log(`problem with request:${e.message}`);
        }); 
    });

    req.write(postData);
    req.end();
    console.log(`start to get data. pn:${pn} city:${city} kd:${kd}`);
};

exports.run = getData;
二:データはどこに保存しますか?
チェックの分かれ目がJsonオブジェクトに戻るなら、当然、mongoDbを保存するのが一番簡単です.
下はmongoDbのパッケージです.
var save=function (city,jsonObj) {
    var Db = require('mongodb').Db;
    var Server = require('mongodb').Server;

    var db = new Db('test',new Server('localhost',27017))

    db.open((err,db)=>{
        var coll = db.collection(city);
        coll.save(jsonObj,(err,r)=>{
            if(!err){
               console.log('save to '+city); 
            }
            
            db.close();
        });
        
    });
};

var removeAll = function (city,callback) {
    var Db = require('mongodb').Db;
    var Server = require('mongodb').Server;

    var db = new Db('test',new Server('localhost',27017))

    db.open((err,db)=>{
        var coll = db.collection(city);
        coll.remove((err,numOfRows)=>{
            if(!err){
                console.log(`${city} collection be removed. ${numOfRows}`);
            }
            db.close();
            callback(err);
        });
      
    });
};

var readAll=function (city,callback) {
    var Db = require('mongodb').Db;
    var Server = require('mongodb').Server;

    var db = new Db('test',new Server('localhost',27017))

    db.open((err,db)=>{
        var coll = db.collection(city);
        var cursor = coll.find();
        cursor.toArray((err,results)=>{
            if(!err){
                callback(results);
                //db.close();        
            }
            db.close();
        });
    });
}

exports.save = save;
exports.removeAll = removeAll;
exports.readAll = readAll;
 
どのようにデータを展示しますか?
nodejsが持参したhttp Serverを使って、要請を受けたら直接にファイルを読み込んで、比較した情報をhtmlテキストに記入して、h 5のチャートで展示します.
以下はサーバのコードです.
var http = require('http');
var fs = require('fs');
var stati = require('./statistics');
var szStati = {text:'SuZhou'};
var shStati = {text:'ShangHai'};

var server=new http.Server();  
server.on('request',function(req,res){  
    res.writeHead(200,{'Content-Type':'text/html'});  
    
    fs.readFile('./index.html','utf8',(err,data)=>{
        if (err) {
            throw err;
        }
        console.log(data);
        // res.write(data);
        // res.end();
        stati.statiSalary('  ',(results)=>{
            szStati.values = results;
            stati.statiSalary('  ',(results)=>{
                shStati.values = results;
                var series =[szStati,shStati];
                var strSeries = JSON.stringify(series);
                console.log(strSeries);
                
                data = data.replace('@series',strSeries);
                console.log(data);
                
                res.write(data);
                res.end();
            });
        });
    });
});  
  
server.listen(3000);  
console.log('http server started...port:3000');
四:統計結果
統計は0-5 k、5-10 k、10-15 k、15-20 k、20-25 k、25 kのこれらの区間によって職位の数量によって統計します.
0-5 k:上海は蘇州の4倍です.
5-10 k:上海は蘇州の4倍です.
10-15 k:上海は蘇州の9倍です.
15-20 k:上海は蘇州の12倍です.
20-25 k:上海は蘇州の17倍です.
>25 k:上海は蘇州の26倍です.
10-15 kから始まる職位が見られます.上海の数は蘇州の10倍以上で、高給の職位がもっと高いです.ここから見ると、蘇州と上海の差はまだ大きいです.苏州政府はずっとうぬぼれています.自分はインターネットのサークルで多くの牛に迫られて孵化器を作ったと思いますが、手を出した会社はいくつありますか?片手で数えてきました.
私も故郷を離れて上海の未来を探しに行きます.
まだマスターしていません.VSコードをgithubにアップロードします.直接コードをアップロードしてください.lagou Spider.zip