Node Crawler:強力なNode開源爬虫類

9615 ワード

Nodeが登場してから、すぐに爬虫類を開発する人がいて、ネット上でもよく見られるNode爬虫教程です.しかし、汎用的で機能豊富な爬虫類のオープンソースプロジェクトを見るのは難しいので、Githubでこれを見つけて、今見つけられる最高のものです.
ここでは、ドキュメントを翻訳して、より多くの実用的なケースを期待します.
node-crawler
Nodeコミュニティで最も強力で流行している爬虫類/コンテンツ抽出ツールライブラリを構築し、生産環境をサポートすることを目標としています.
機能:
  • サービス側DOMと自動jQuery注入、Cheerio(デフォルト)またはJSDOMを使用
  • 構成可能な接続プールサイズと再試行回数
  • Control rate limit
  • リクエストキュー優先度設定サポート
  • forceUTF 8モードで爬虫処理文字セットをエンコードして検出・変換できる
  • 互換ノード4.xおよび上記バージョン
  • 更新ログ:https://github.com/bda-research/node-crawler/blob/master/CHANGELOG.md
    マニュアル
    インストール
    $ npm install crawler
    

    使用
    var Crawler = require("crawler");
    
    var c = new Crawler({
        maxConnections : 10,
        //                 
        callback : function (error, res, done) {
            if(error){
                console.log(error);
            }else{
                var $ = res.$;
                // $    Cheerio
                //             jQuery    
                console.log($("title").text());
            }
            done();
        }
    });
    
    //     URL,     callback
    c.queue('http://www.amazon.com');
    
    //   URL  
    c.queue(['http://www.google.com/','http://www.yahoo.com']);
    
    //     ,   callback   
    c.queue([{
        uri: 'http://parishackers.org/',
        jQuery: false,
    
        //      callback
        callback: function (error, res, done) {
            if(error){
                console.log(error);
            }else{
                console.log('Grabbed', res.body.length, 'bytes');
            }
            done();
        }
    }]);
    
    //         HTML  ,    (mostly for tests)
    c.queue([{
        html: '

    This is a test

    ' }]);

    スキップ間隔の制御
    トラフィックサイトにいるときは、rateLimit間隔を制御します.
    var crawler = require("crawler");
    
    var c = new Crawler({
        rateLimit: 1000, // `maxConnections`     1 
        callback: function(err, res, done){
            console.log(res.$("title").text());
            done();
        }
    });
    
    c.queue(tasks);//              1000 (ms)
    

    構成項目ガイド
    これらの構成は、Crawler()コンストラクタに配布してグローバル構成にするか、カスタムqueue()のリクエストでグローバル構成が上書きされます.
    この構成リストはmikealのrequestプロジェクト構成に基づいて拡張され、request()メソッドに直接送信されます.
    基本要求の構成:
  • uri:Stringあなたがアクセスしたいページへのリンク.
  • timeout:Number単位はミリ秒(デフォルト15000).
  • mikealのrequestのすべての構成をサポートする.

  • コールバック:
  • callback(error, res, done):リクエストが完了すると呼び出される
  • error : Error
  • res : http.IncomingMessageリクエストの応答は、$およびoptions
  • res.statusCode : Number HTTP status code. E.G. 200
  • res.body:Buffer|StringHTTP返却内容は、HTMLページ、プレーンテキストまたはXMLドキュメントである可能性があります.
  • res.headers:ObjectHTTPリクエストの返信ヘッダ
  • res.request:Request MikealのRequestの例をhttpの代わりにする.ClientRequest
  • res.request.uri:urlObject解析後のURLエンティティ
  • res.request.method : String HTTP request method. E.G. GET
  • res.request.headers : Object HTTP request headers

  • res.options:Optionsプロファイル
  • $:jQuery Selector HTMLとXMLのセレクタ
  • done:Functionコールバックでやるべきことが終わったらこれを呼び出す

  • 計画タスクのオプション:
  • maxConnections:Number接続プールサイズ(デフォルト10).
  • rateLimit:Number各リクエスト間の間隔時間、単位ミリ秒(デフォルト0).
  • priorityRange:Number許容できる優先度の数値は、最小で0(デフォルト10).
  • priority:Number現在のリクエストの優先度(デフォルト5).

  • 再試行オプション:
  • retries:Numberリクエスト失敗後の再試行回数(デフォルト3)
  • retryTimeout:Number再試行までの待ち時間、単位ミリ秒(デフォルト10000)
  • サービス側DOM構成:
  • jQuery:Boolean|String|Objecttrueに設定されている場合はcheerioデフォルト構成を使用して這い出し内容を注入します.または解析オプションを使用するカスタマイズcheerio.falseに戻るとjQueryセレクタの注入が停止します.プロジェクトにメモリ漏れがある場合は、代替の解析器「whack」を使用して回避します.(デフォルトtrue)
  • 文字セットのエンコーディング:
  • forceUTF8:Booleantrueに設定すると、爬虫類はHTTPリクエストヘッダから文字セットを取得したりHTMLからmeta tagを取得したりしてUTF 8に変換し、符号化の問題を心配することなく(デフォルトtrue)
  • incomingEncoding:String設定forceUTF8: true自分で受信内容の符号化(デフォルトnull)を設定でき、爬虫類は自分で符号化を検出しなくてもよい.例えば、incomingEncoding : 'windows-1255'.サポートされているすべてのエンコーディングを表示する
  • キャッシュ:
  • skipDuplicates:Booleantrueに設定されている場合は、登ったURIをスキップし、トリガーすらしないcallback()(デフォルトfalse).変更を推奨しないで、もっと良い方法は爬虫類の外でseenreqを使って処理することです.

  • その他:
  • rotateUA:Booleantrueの場合userAgent配列であるべきで、入れ替え(デフォルトfalse)
  • userAgent:String|ArrayrotateUAはfalseだがuserAgentは配列であり、爬虫類は最初の値を使用する.
  • referer:StringHTTPのreferer headerを設定する
  • Class:Crawler
    Event: 'schedule'
  • options Options

  • タスクが計画に追加されるとトリガーされます.
    crawler.on('schedule',function(options){
        options.proxy = "http://proxy:port";
    });
    

    Event: 'limiterChange'
  • options Options
  • limiter String

  • limiterが変化するとトリガーされる.
    Event: 'request'
  • options Options

  • 爬虫類が要求を送信する準備ができたらトリガーする.
    リクエストを発行する前の最後の段階で構成を変更したい場合は、このイベントを傍受できます.
    crawler.on('request',function(options){
        options.qs.timestamp = new Date().getTime();
    });
    

    Event: 'drain'
    キューが空の場合にトリガーされます.
    crawler.on('drain',function(){
        //       , ,       。
        db.end(); //   MySQL  。
    });
    

    crawler.queue(uri|options)
  • uri String
  • options Options

  • タスクをキューに追加し、実行を待機します.
    crawler.queueSize
  • Number

  • 読み取り専用のキュー数.
    ボトルネックの処理
    limiterを使用して、登り頻度を制御します.limiterに提出されたすべてのタスクは、rateLimitおよびmaxConnectionsの制限を遵守する必要があります.rateLimit両タスク間の最小間隔、maxConnections最大同時数です.Limiters間は互いに独立している.1つの一般的な例は、異なるエージェントに異なるlimiterを設定することである.なお、rateLimit0以外の値に設定と、maxConnectionsの値が1に強制される.
    var crawler = require('crawler');
    
    var c = new Crawler({
        rateLimit: 2000,
        maxConnections: 1,
        callback: function(error, res, done) {
            if(error) {
                console.log(error)
            } else {
                var $ = res.$;
                console.log($('title').text())
            }
            done();
        }
    })
    
    //      2000         
    c.queue('http://www.somewebsite.com/page/1')
    c.queue('http://www.somewebsite.com/page/2')
    c.queue('http://www.somewebsite.com/page/3')
    
    //          ,        2000     
    c.queue({
        uri:'http://www.somewebsite.com/page/1',
        limiter:'proxy_1',
        proxy:'proxy_1'
    })
    c.queue({
        uri:'http://www.somewebsite.com/page/2',
        limiter:'proxy_2',
        proxy:'proxy_2'
    })
    c.queue({
        uri:'http://www.somewebsite.com/page/3',
        limiter:'proxy_3',
        proxy:'proxy_3'
    })
    c.queue({
        uri:'http://www.somewebsite.com/page/4',
        limiter:'proxy_1',
        proxy:'proxy_1'
    })
    

    Work with Cheerio or JSDOM
    爬虫類はデフォルトでCheerioを使用し、JSDOMをオプションの代替として使用します.JSDOMの方が安定しているので、JSDOMを使いたい場合は、この依存を導入する必要がありますrequire('jsdom')爬虫類を配置します.
    Working with Cheerio
    jQuery: true //(default)
    //OR
    jQuery: 'cheerio'
    //OR
    jQuery: {
        name: 'cheerio',
        options: {
            normalizeWhitespace: true,
            xmlMode: true
        }
    }
    

    これらの解析構成はhtmlparser 2から継承される.使用可能なすべての構成を使用できます.デフォルトの設定は次のとおりです.
    {
        normalizeWhitespace: false,
        xmlMode: false,
        decodeEntities: true
    }
    

    すべての構成項目とそれらの効果が必要で、こことhtmlparser 2の構成項目を確認します.ソース
    Work with JSDOM
    JSDOMを使用するには、プロジェクトディレクトリの下npm install jsdomに爬虫類を配置する必要があります.
    var jsdom = require('jsdom');
    var Crawler = require('crawler');
    
    var c = new Crawler({
        jQuery: jsdom
    });
    

    テスト方法
    Httpbinのインストールと実行
    爬虫類は地元のhttpbinを使ってテストします.PyPIからhttpbinをインストールし、WSGIアプリケーションとして許可することができます.たとえば、Gunicornを使用します.
    $ pip install httpbin
    # launch httpbin as a daemon with 6 worker on localhost
    $ gunicorn httpbin:app -b 127.0.0.1:8000 -w 6 --daemon
    # Finally
    $ npm install && npm test
    

    Dockerの使用
    Dockerをインストールすると、次のことができます.
    # Builds the local test environment
    $ docker build -t node-crawler .
    
    # Runs tests
    $ docker run node-crawler sh -c "gunicorn httpbin:app -b 127.0.0.1:8000 -w 6 --daemon && cd /usr/local/lib/node_modules/crawler && npm install && npm test"
    
    # You can also ssh into the container for easier debugging
    $ docker run -i -t node-crawler bash
    

    いくつかの比較的困難な待機事項
  • zombieを使って複雑なajaxがあるページを処理する
  • refactoring the code to be more maintainableリビルドコードでメンテナンスしやすい
  • Sizzleテスト(JSDOMバグ?https://github.com/tmpvar/jsdom/issues#issue/81)
  • Promise対応
  • Commander対応
  • ミドルウェア対応