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
マニュアル
インストール
使用
スキップ間隔の制御
トラフィックサイトにいるときは、
構成項目ガイド
これらの構成は、
この構成リストはmikealのrequestプロジェクト構成に基づいて拡張され、
基本要求の構成: mikealのrequestのすべての構成をサポートする.
コールバック:
計画タスクのオプション:
再試行オプション: サービス側DOM構成: 文字セットのエンコーディング: キャッシュ:
その他: Class:Crawler
Event: 'schedule'
タスクが計画に追加されるとトリガーされます.
Event: 'limiterChange'
limiterが変化するとトリガーされる.
Event: 'request'
爬虫類が要求を送信する準備ができたらトリガーする.
リクエストを発行する前の最後の段階で構成を変更したい場合は、このイベントを傍受できます.
Event: 'drain'
キューが空の場合にトリガーされます.
crawler.queue(uri|options)
タスクをキューに追加し、実行を待機します.
crawler.queueSize
読み取り専用のキュー数.
ボトルネックの処理
limiterを使用して、登り頻度を制御します.limiterに提出されたすべてのタスクは、
Work with Cheerio or JSDOM
爬虫類はデフォルトでCheerioを使用し、JSDOMをオプションの代替として使用します.JSDOMの方が安定しているので、JSDOMを使いたい場合は、この依存を導入する必要があります
Working with Cheerio
これらの解析構成はhtmlparser 2から継承される.使用可能なすべての構成を使用できます.デフォルトの設定は次のとおりです.
すべての構成項目とそれらの効果が必要で、こことhtmlparser 2の構成項目を確認します.ソース
Work with JSDOM
JSDOMを使用するには、プロジェクトディレクトリの下
テスト方法
Httpbinのインストールと実行
爬虫類は地元のhttpbinを使ってテストします.PyPIからhttpbinをインストールし、WSGIアプリケーションとして許可することができます.たとえば、Gunicornを使用します.
Dockerの使用
Dockerをインストールすると、次のことができます.
いくつかの比較的困難な待機事項zombieを使って複雑なajaxがあるページを処理する refactoring the code to be more maintainableリビルドコードでメンテナンスしやすい Sizzleテスト(JSDOMバグ?https://github.com/tmpvar/jsdom/issues#issue/81) Promise対応 Commander対応 ミドルウェア対応
ここでは、ドキュメントを翻訳して、より多くの実用的なケースを期待します.
node-crawler
Nodeコミュニティで最も強力で流行している爬虫類/コンテンツ抽出ツールライブラリを構築し、生産環境をサポートすることを目標としています.
機能:
マニュアル
インストール
$ 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).コールバック:
callback(error, res, done)
:リクエストが完了すると呼び出されるerror
: Error res
: http.IncomingMessageリクエストの応答は、$
およびoptions
res.statusCode
: Number
HTTP status code. E.G. 200
res.body
:Buffer
|String
HTTP返却内容は、HTMLページ、プレーンテキストまたはXMLドキュメントである可能性があります.res.headers
:Object
HTTPリクエストの返信ヘッダ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)jQuery
:Boolean
|String
|Object
trueに設定されている場合はcheerio
デフォルト構成を使用して這い出し内容を注入します.または解析オプションを使用するカスタマイズcheerio
.falseに戻るとjQueryセレクタの注入が停止します.プロジェクトにメモリ漏れがある場合は、代替の解析器「whack」を使用して回避します.(デフォルトtrue)forceUTF8
:Boolean
trueに設定すると、爬虫類はHTTPリクエストヘッダから文字セットを取得したりHTMLからmeta tagを取得したりしてUTF 8に変換し、符号化の問題を心配することなく(デフォルトtrue)incomingEncoding
:String
設定forceUTF8: true
自分で受信内容の符号化(デフォルトnull)を設定でき、爬虫類は自分で符号化を検出しなくてもよい.例えば、incomingEncoding : 'windows-1255'
.サポートされているすべてのエンコーディングを表示するskipDuplicates
:Boolean
trueに設定されている場合は、登ったURIをスキップし、トリガーすらしないcallback()
(デフォルトfalse).変更を推奨しないで、もっと良い方法は爬虫類の外でseenreqを使って処理することです.その他:
rotateUA
:Boolean
trueの場合userAgent
配列であるべきで、入れ替え(デフォルトfalse)userAgent
:String
|Array
、rotateUA
はfalseだがuserAgent
は配列であり、爬虫類は最初の値を使用する.referer
:String
HTTPのreferer headerを設定する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を設定することである.なお、rateLimit
0以外の値に設定と、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
いくつかの比較的困難な待機事項