nodejsは異歩併発爬虫類を実現します.


  • クライテリア
  • コードを修正しました.
  • 後記
  • 前言
    先日は簡単なドリアンと今日の最初の写真を実現しました.しかし、彼らはすべての欠点があります.現在の任務を完成してから、次の任務を行うことができます.だからネットで検索しました.以前はコンピュータの専門ではなかったので、初めの時は異歩と同時進行の概念を理解するために時間がかかりました.上に閉塞と非同期の違いを説明する文章があると知っていますが、どうやって閉塞と同期非同期の違いを理解しますか?自分で非を理解して同期とは
  • 同期:戻りの結果を待つ必要があります.他のことを続けることができます.
  • 非同期:戻りの結果を待つことなく、他のことを続けることができます.
  • 爬虫類の中で使うのは同期です.一度に一組の写真を登って、一組で登り終わったら、二組目に登ります.非同期は同時に複数の写真を取るので、待つ必要はありません.そのため非同期効率は同期よりずっと速い.余計なことを言わないで、コードを入れてください.
    コードを修正しました
    具体的な操作手順はnodejsが動画サイトに登って今日の頭条街で写真を撮ることを例にします.jsのコードを修正しただけですので、ここでは具体的な手順は説明しません.非同期化モジュールはasync.mapLimitで実装される.具体的な呼び出し方法は、以下のようにasync.mapLimit(coll, limit, iteratee, callback opt)各パラメータの意味があります.
    パラメータ
    タイプ
    意味
    コール
    Aray/Iterable/object
    反復する集合
    limie
    number
    一回の非同期操作の最大数量
    iteratee
    Aync Functioncollの各アイテムに対して、非同期関数が反復的に実行される.(item, callback)で呼び出し、callbackはオプションです.
    calback
    [function]
    すべてのiteratee関数が完了した後、またはエラーが発生した時にトリガされるコールバック関数です.(err, results)で呼び出します.resultsは、iteratee関数が完了した後にcallbackをトリガするときに渡されるアイテムでありうる.
    前のコードを規範化して、すべてのvarを削除しました.定数は全部constに変えました.変数はletです.
    完全なjsコードは以下の通りです.
    /*
    * @Author: user
    * @Date: 2018-05-02 09:46:38
    * @Last Modified by:   user
    * @Last Modified time: 2018-05-02 09:46:45
    */
    const https=require('https');
    const fs=require('fs');
    const request=require('request');
    const async=require('async');
    const startPage =0;//   
    const endPage = 1;//   
    let page=startPage;
    let i=0;
    //  url
    const url={ 
        hostname: 'www.toutiao.com',
        path: '/search_content/?offset='+startPage*20+'&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=3&from=gallery',
        headers: {
            'Content-Type': 'text/html',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',  
      }
    }
    let urlList=[];//        
    //        
    function getUrl(url){
        //  http          get    
        https.get(url,function(res){
            var html='';
            res.setEncoding('binary');
            //  data  ,       
            res.on('data',function(chunk){
                html+=chunk;
            });
            res.on('end',function(){
                html=JSON.parse(html);//         JSON   ,    JSON.parse       
                for(let i of html.data){
                    var obj ={title:i.title,url:i.article_url};
                    urlList.push(obj);
                }
                console.log(urlList.length);
                page++;
                if(page<=endPage){
                    let tempUrl='https://www.toutiao.com/search_content/?offset='+page*20+'&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=3&from=gallery';
                    getUrl(tempUrl);        
                }else{
                    fetchPage();
                }
            })
        }).on('err',function(err){
            console.log(err);
        })
    }
    function fetchPage(){
        //      
        async.mapLimit(urlList,5,function(url,callback){
            //                
            url.url='https://www.'+url.url.substring(7,19)+'a'+url.url.substring(25);
            https.get(url.url,function(res){
                let html='';
                res.setEncoding('binary');
                res.on('data',function(chunk){
                    html+=chunk;
                })
                res.on('end',function(){
                    var news_item = {
                        //       
                        title: url.title,
                        //i             
                        i: i = i + 1,     
                      };
                    console.log(news_item);     //    
                     //    script      
                    const reg=/http\:\\\/\\\/p\d\.pstatp\.com\\\/origin(\\\/pgc\-image)?\\\/[A-Za-z0-9]+/g;
                    let imageList=html.match(reg);
                    savedImg(imageList,url.title);
                })
    
            }).on('err',function(err){
                    console.log(err);
                });
            callback(null,'  ');
        },
        function(err,result){
            if (err){
                    console.log(err)
                }
            else{
                console.log('  ');
                }           
            })
    }
    function savedImg(imageList,title){
        fs.mkdir('./image/'+title,function(err){
            if(err){console.log(err)};
        });
        console.time('  '+title+'  ');
        imageList.forEach(function(item,index){
            let img_title=index;
            let img_filename = img_title + '.jpg';
            let img_src='http://'+item.substring(9);
            request({uri:img_src,encoding:'binary'},function(err,res,body){
                if(!err&&res.statusCode==200){
                    fs.writeFile('./image/'+title+'/' + img_filename,body,'binary',function(err){
                        if(err){
                            console.log(err);
                        }
                    })
                }
            })
        })
        console.timeEnd('  '+title+'  ');
    }
    
    
    getUrl(url);//       
    後記
    プロミス関数についてはよく知っていましたが、具体的なプロジェクトでは使ったことがありません.今回の爬虫類を通じてプロミセとasyncについてもっと詳しく知りました.科の出身ではないので、異歩の概念に対しては最初から概念がなく、自分の基礎知識の部分的な欠陥を補っています.