2016-08-12 5 views
0

現在、私が取り組んでいるTensorFlow実装の記事データを取得しようとしています。私が取り組もうとしている最初の情報源はBuzzfeedです。私はページを擦るためにnode.js async.jsライブラリを使用していますが、私は約200程度の記事の後にいつも彼らのサーバからECONNRESETエラーを取得して時間を持っています。非同期でアーカイブをスクラップする場合のECONNRESET

これを実行するとかなり早く要求が出るようですが、これが適用される遅延のためにasync.eachSeriesを使用することに決めました。私はこれを見続けるつもりですが、誰かが私が間違ってやっていること、あるいはこれを達成するためのよりよい方法を見たら、あなたが何を言わなければならないのか聞いてみたいと思います。ありがとう!

const scraper = testHelperGetScraper(); 

// scrape links to each news in buzz archive page 
const archiveUrl = 'http://www.buzzfeed.com/archive'; 
let fileNum = -1; 

scraper.scrapeArchiveDates(archiveUrl, function(err, dates){ 
    async.eachSeries(dates.yearUrl, function(url, cb){ 
     async.waterfall([ 
      function(callback){ 
       scraper.scrapeArchive(url, callback); 
      }, 
      function(urlArr, callback){ 
       for (var i in urlArr.url){ 
        if (typeof (urlArr.url[i]) === 'string'){ 
         scraper.scrapeArticle(urlArr.url[i], callback); 
        } 
       } 
      } ,function(res, callback){ 
       cb(); 
       callback(null, res); 
      } 
     ], 
     function(err, buzzresult) { 
      if (err){ 
       _logger.error('Error while inserting test data', err); 
      } 

      buzzresult.uniqueId = UniqueHelper.getUIntId({ 
       text: buzzresult.title 
       , options: { 
        ignoreCase: true 
        , strip: ['urls', 'hashtags', 'users', 'quotes', 'punct'] 
       } 
      }); 

      let fileFullPath = _rootFolderWhereYouWantToSave 
       + 'rawdata_' + buzzresult.uniqueId + '.txt'; 
      //_logger.debug('fileFullPath', fileFullPath); 

      let finalDataWritten = buzzresult.title + os.EOL + buzzresult.body + os.EOL; 

      writeArticleFile(fileFullPath, finalDataWritten); 
      //console.log('Finsihed calling WriteArticleFile: ', finalDataWritten); 
      _counter += 1; 
      console.log('NumArticlesWritten: ', _counter); 
     }); 

    }, function (error) { 
     if (error) { 
      throw error; 
     } 
     console.log('Finished!'); 
    }); 
}); 
+1

'... scraper.scrapeArticle(urlArr.url [i]は、コールバック);'ミックス非同期及び同期コードの問題です。 'for'を' async.each(urlArr、scraper.scrapeArticle、callback) 'に変更してください。 –

答えて

1

コードを少し簡略化します。
名前付き関数を使用すると、より読みやすいコードを作成できます。 (urlArr.urlでVAR i)に対する

const scraper = testHelperGetScraper(); 
const archiveUrl = 'http://www.buzzfeed.com/archive'; 
let fileNum = -1; 

scraper.scrapeArchiveDates(archiveUrl, function(err, dates){ 
    async.eachSeries(dates, parseDate, (err) => (err) ? throw err : console.log('Finished!');); 
}); 

function parseDate(date, callback) { 
    scraper.scrapeArchive(date.yearUrl, function(err, urls) { 
     if (err) 
      return callback(err); 

     urls = urls.filter((url) => typeof(url) === 'string')); 
     async.each(urls, scraper.scrapeArticle, function(err, buzzresult) { 
      if (err) { 
       _logger.error('Error while inserting test data', err); 
       return callback(err); 
      } 

      ... // process result 
     }) 
    }); 
} 
+0

Aikon本当にありがとうございます!あなたのコードがとても優雅に見えるだけでなく、期待通りに機能するという点で、私はちょっと気分が悪くなります。私は明らかにまだ多くのことを学ぶ必要があります:)それは完璧です。私はバズフィードで毎日のカレンダーがあることに気付きました。今も同様に実装するつもりですが、これですべての問題が解決しました。再度、感謝します!! – xtr33me

+0

誰かがこの問題に遭遇した場合に備えて、この最後のコメントが1つだけあります。私が必要としたわずかな変更は、async.eachの代わりにasync.mapを使用することでした。主な理由は、buzzresultを処理する必要があったからです。変更を加えた後、すべてが期待通りに機能しました。私は上記のロジックを同じように変更しました。 – xtr33me

関連する問題