node爬虫類の実戦-ネットの職務のデータをよじ登ります

7623 ワード

node爬虫類の実戦-ネットの職務のデータによじ登って、主にデータを大きいデータの学習に用いたくて、その時大きいデータは自分で職務の情況を分析することができて、いくつか私の今の職務を比較して深セン更には全国の開発人員のレベルにあります.
関連する技術スタック:node.js、mongoDB、express 
ソースのダウンロード:https://gitee.com/draven_lee/node-spider ,お役に立てれば、賞はいらないです.スターさんに歓迎します.
この爬虫類の機能はちょっと簡単です.勉強の参考にしてください.
  • Lagou.comのトップページのmenuメニューのurlを登り、menuのトップ30ページのurlを爬虫類の列に保存した後、キューのurlに沿って必要なデータを抽出します.
  • は登る過程で、頻繁すぎるとユーザーの登録状態がないと他のページに調和され、フックネットが爬虫防止機構を作ったはずです.だから、私は登るスピードを遅くして、シミュレーションの登録状態を加えて、データの取得に成功しました.でも、これによって少し遅いスピードで登りました.四日間四泊で10 W+職位データを登りました.
  • ナンセンスはともかく、先にコードを入れます.
    var express = require('express');
    var MongoClient = require('mongodb').MongoClient;
    const request = require('superagent');
    var url = "mongodb://localhost:27017/draven";
    var router = express.Router();
    var cheerio = require('cheerio');
    var Crawler = require("crawler");
    
    
    //     
    router.get('/crawlData', function(req, res, next) {
    
    
        var url = "mongodb://localhost:27017/draven";
        var menuList = [];
        var urlList = []
        var location = '  ';
    
        MongoClient.connect(url, function(err, db) {
            if (err) throw err;
            var dbo = db.db("draven");
    
    
            var c = new Crawler({
                preRequest: function(options, done) {
                    // 'options' here is not the 'options' you pass to 'c.queue', instead, it's the options that is going to be passed to 'request' module
                    console.log(options.uri);
                    // when done is called, the request will start
                    done();
                },
                jQuery: true,       //    cheerio  jQuery  
                rateLimit:25000,    //     25     
                maxConnections : 1, //        1
                headers:{           //           
                    'Cookie':'index_location_city='+encodeURI(location)+'user_trace_token=20181127172617-5d56fc60-618b-4486-9762-21efad3c49df; JSESSIONID=ABAAABAAAFCAAEG70DFEA8B139FF80287ABDF2F4C137946; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; index_location_city=%E6%B7%B1%E5%9C%B3; _ga=GA1.2.405959562.1543310779; _gid=GA1.2.577762828.1543310779; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1543310402,1543310779; LGSID=20181127172618-7ef404ed-f226-11e8-80e4-525400f775ce; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; LGUID=20181127172618-7ef406c2-f226-11e8-80e4-525400f775ce; _gat=1; TG-TRACK-CODE=index_navigation; SEARCH_ID=88db5c7fa2464090a6dd7041f35074ba; X_HTTP_TOKEN=492369107a1a20441020ab9b771f2f6d; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221675489482d244-0f3ef5ad6aef94-4313362-2073600-1675489482e36f%22%2C%22%24device_id%22%3A%221675489482d244-0f3ef5ad6aef94-4313362-2073600-1675489482e36f%22%7D; sajssdk_2015_cross_new_user=1; ab_test_random_num=0; _putrc=69D503B669D896FC123F89F2B170EADC; login=true; hasDeliver=0; gate_login_token=33f3414d87f12e09e089b3b6daf10134f0a5ebf49fad63dfd9b8bc4e3a4f162b; unick=hello; LGRID=20181127174101-8d501f2b-f228-11e8-8c21-5254005c3644; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1543311662',
                    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
                },
                callback : function (error, res, done) {
                    if(error){
                        console.log(error);
                        done();
                    }else{
                        var $ = res.$;
    
                        var jobList = []
                        console.log($('title').text())
                        $('.con_list_item').each(function (idx, item) {
                            var $item = $(item);
                            jobList.push({
                                name: $item.find('.position_link').find('h3').text(),
                                address: $item.find('.add').find('em').text(),
                                company: $item.find('.company_name').find('a').text(),
                                companyLink: $item.find('a').attr('href'),
                                companyImg: $item.find('.com_logo').find('img').attr('src'),
                                money: $item.find('.money').text(),
                                label:$item.find('.list_item_bot').find('span').text(),
                                welfare:$item.find('.li_b_r').text()
                            });
                        });
                        try {
    
                            console.log('c.queueSize',c.queueSize);
                            console.log('jobList',jobList.length)
                            if(jobList.length > 0 ){
                                //       
                                dbo.collection("job").insertMany(jobList, function(err, res) {
                                    if (err) throw err;
                                    console.log('job       !');
                                    // db.close();
    
                                })
                            }
                            done();
                        }catch(e){
                            console.log(e);
                            done();
                        }
                    }
                }
            });
    
            //     menu   
            c.queue([
                {
                uri: 'https://www.lagou.com/',
                headers:{
                    'Set-Cookie':'index_location_city='+encodeURI(location),
                    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
                    'JSESSIONID':'ABAAABAAAGFABEFC5E29AF672C4DAF0B10AEE494D83FD62',
                    'login':true
                },
                // The global callback won't be called
                callback: function (error, res, done) {
                    if(error){
                        console.log(error);
                    }else{
                        var $ = res.$;
                        $('.menu_sub a').each(function (idx, element) {
                            var $element = $(element);
                            menuList.push({
                                name: $element.text(),
                                tjId: $element.attr('data-lg-tj-id'),
                                // tjIdName:changeName($element.attr('data-lg-tj-id')),
                                tjNo:$element.attr('data-lg-tj-no'),
                                tjCid:$element.attr('data-lg-tj-cid'),
                                link:$element.attr('href'),
                            });
                            //  menu 30  url 
                            for(var i = 1 ;i<=30 ;i++){
                                urlList.push($element.attr('href')+i+'/');
                            }
    
                        });
                        //      menu URL             
                        c.queue(urlList);
                        console.log(urlList,urlList.length)
                        console.log('menuList  ',menuList.length ,'   ');
                        dbo.collection("menu").insertMany(menuList, function(err, res) {
                            if (err) throw err;
                            console.log('      !');
                            // db.close();
                        })
                    }
                    done();
                }
            }])
            res.render('craw');
        });
    });
    
    
    
    module.exports = router;