2017-02-20 10 views
0

私は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));)

+0

約束を通じてURIを渡し、そしてあなたのハンドラを変更するには、このscrapeUriを修正しますか?その署名はいくつかのフレームワークによって規定されていますか?そうでなければ、 '($、uri)=> {...}'または '($)=>(uri)=> {...}'のどちらかにすることはできませんか? (あなたの好みに応じて、逆順で変更する可能性が最も高いです。) –

+0

私は疑問に思うのですが、これらの関数は 'objectifyContent'が一連の' map'の最後にあるシリーズで使われています。 'フィルター'。シリーズの後半で使用するために各アレイのURIをどのように格納すればよいですか? – LA1CH3

+0

あなたは '.map()'と '.filter()'を使って実際のコードを表示しなければなりません。おそらく蓄積したいのは、単一の値をフィルタリングするのではなく、いくつかのプロパティを持つオブジェクトの配列です。各ユニットに複数の情報を格納することができます。 – jfriend00

答えて

0

はなぜ単にobjectifyContent` `の署名に追加していないに応じて

const scrapeUri = uri => fetch(uri).then(
    webpage => [uri, webpage] 
) 
+0

これは本質的に私が行った考えですが、 'Promise.props'を使用し、配列ではなくオブジェクトを使用した点が異なります。 – LA1CH3

関連する問題