私はNode.js Webスクレーパーアプリケーションで以下のようなコードを使用していて、コードを機能的に方向づけようとしています。以下を参照してください:objectifyContent
で一連の関数でデータを渡す最善の方法は?
const Promise = require('bluebird');
const fetch = require('node-fetch');
const cheerio = require('cheerio');
const scrapeUri = uri => fetch(uri); // how should i pass the uri from here
const fetchURIs = URIs => Promise.all(URIs.map(scrapeUri));
const getBodies = pages => Promise.all(pages.map(page => page.text()));
const toSource = source => cheerio.load(source);
const shouldScrape = ($) => {
const shouldIndex = $('meta[name="robots"]').attr('content');
if (['noindex', 'nofollow'].indexOf(shouldIndex) !== -1) {
return false;
}
return true;
};
const objectifyContent = ($) => { // to be accessed here
return {
meta: {
index_timestamp: new Date(),
title: $('title').html(),
// TODO: this will totally fail in some instances, need to pass uri from initial instance
uri: $('link[rel="canonical"]').attr('href'),
description: $('meta[name="description"]').attr('content'),
},
};
};
、初期scrapeUri
からURIにアクセスする代わりの正規にアクセスすることで、ページのURLを取得しようとしているの純粋な方法だろうか?私は変数を設定してスコープを継承できるいくつかの方法を知っていますが、Node.jsのコンテキストでこれをより洗練されたより機能的な方法で実行するかどうか疑問に思っていました。
呼び出し側が似ているでしょう: fetchUris(myUris).then(values => getBodies(values).then(sources => res.send(sources.map(toSource).filter(shouldScrape).map(objectifyContent));)
約束を通じてURIを渡し、そしてあなたのハンドラを変更するには、この
scrapeUri
を修正しますか?その署名はいくつかのフレームワークによって規定されていますか?そうでなければ、 '($、uri)=> {...}'または '($)=>(uri)=> {...}'のどちらかにすることはできませんか? (あなたの好みに応じて、逆順で変更する可能性が最も高いです。) –私は疑問に思うのですが、これらの関数は 'objectifyContent'が一連の' map'の最後にあるシリーズで使われています。 'フィルター'。シリーズの後半で使用するために各アレイのURIをどのように格納すればよいですか? – LA1CH3
あなたは '.map()'と '.filter()'を使って実際のコードを表示しなければなりません。おそらく蓄積したいのは、単一の値をフィルタリングするのではなく、いくつかのプロパティを持つオブジェクトの配列です。各ユニットに複数の情報を格納することができます。 – jfriend00