2

pjscrapeはスクレイピングには最適ですが、スクレイパーに引数を渡す方法を理解するのに苦労しています。

構成ファイルのコマンドライン引数を取りますが、構成関数/変数の範囲がわかりません。

ベースURL、セレクターなどを含むドメインごとの構成を持ち、この構成から読み取ることができるやや一般的なスクレーパーを構築したいと思います。

どうやってやるの?

4

1 に答える 1

4

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])
        })
    });
    
于 2012-12-17T02:08:53.853 に答える