pjscrapeはスクレイピングには最適ですが、スクレイパーに引数を渡す方法を理解するのに苦労しています。
構成ファイルのコマンドライン引数を取りますが、構成関数/変数の範囲がわかりません。
ベースURL、セレクターなどを含むドメインごとの構成を持ち、この構成から読み取ることができるやや一般的なスクレーパーを構築したいと思います。
どうやってやるの?
pjscrapeはスクレイピングには最適ですが、スクレイパーに引数を渡す方法を理解するのに苦労しています。
構成ファイルのコマンドライン引数を取りますが、構成関数/変数の範囲がわかりません。
ベースURL、セレクターなどを含むドメインごとの構成を持ち、この構成から読み取ることができるやや一般的なスクレーパーを構築したいと思います。
どうやってやるの?
Pjscrape はすべての引数をグローバル スコープの構成ファイルとして評価し、必要な数の構成ファイルを渡すことができます。そのため、1 つまたは複数のファイルでドメインごとのスクレイパーを構成するのは簡単です。例えば:
base_config.js
var myConfigs = [];
my_site.js
myConfigs.push({
title: 'My Site',
url: 'http://www.example.com',
scraper: 'div#my-site-info'
});
スクレイパー.js
myConfigs.forEach(function(config) {
pjs.addSuite({
title: config.title,
url: config.url,
scraper: config.scraper
})
});
次に、次のように呼び出します。
~> phantomjs /path/to/pjscrape.js base_config.js my_site.js <...> scraper.js
ここで注意が必要なのは、セレクターだけでなく、スクレイパー関数を使用する場合です。PhantomJS は、グローバル スコープ変数にアクセスできない「サンドボックス化された」環境でスクレイパーを実行します。したがって、これは機能しません:
myConfigs.forEach(function(config) {
pjs.addSuite({
scraper: function() {
// will fail - config is undefined!
return $(config.selector).text();
}
})
});
これは些細な例ですが、アイデアはわかります。PhantomJS は に引数を渡すためのネイティブ サポートを備えていますpage.evaluate
が、これらはまだ Pjscrape に組み込まれていません。これに対処するには、基本的に次の 2 つの方法があります。
外部スコープへのアクセスを必要としない関数を常に処理します。したがって、各サイト構成ファイルは、プラグ可能な変数だけでなく、完全なスクレーパー機能を指定します。
でスクレイパーをnew Function("...")
作成し、文字列を作成するときに変数を渡します。これは、Pjscrape が内部で行う方法ですが、公正な警告として、最も単純なケースを除き、すぐに醜くなる可能性があります。Function#toString
ここで使用した 1 つの方法は、引数を使用して渡すことです。これは次のようになります。
function makeFunc(f, args) {
return new Function('return (' + f.toString() + ')' +
'.apply(null, ' + JSON.stringify(args) + ');');
}
myConfigs.forEach(function(config) {
pjs.addSuite({
scraper: makeFunc(function(selector) {
// works - config.selector is passed in as the "selector" arg
return $(selector).text();
}, [config.selector])
})
});