2017-02-02 7 views
0

ここにはリアクタNoobがあります。Reactor 3.x(Java):ウェブ掻き取りのため

これは、HowTo質問の詳細です。

私は、検索結果のページ単位のセットを含むスクラップしたいウェブサイトを持っているとしましょう。検索結果ページの数は不明です。各検索ページには、次のページへのリンクがあります。私はすべてのページからすべての検索結果を削り取り、それぞれの検索結果を処理したいと思います。

Reactor(Mono/Flux)をJavaでどのように使用すればよいですか?

できるだけ「反応的」にしたいと思います。

基本的には、以下の不可欠の擬似コードの炉(3.xの)バージョン:

String url = "http://example.com/search/1"; 
    Optional<Document> docOp = getNextPage(url); (1) 
    while (docOp.isPresent()) { 
     Document doc = docOp.get(); 
     processDoc(doc);       (2) 
     docOp = getNextPage(getNextUrl(doc));  (3) 
    } 

    // (1) Get the first page of search results 
    // (2) Process all the search results on this page asynchronously 
    // (3) Find the next page URL, and get that page 

答えて

0

https://gitter.im/reactor/reactorからいくつかの助けを借りて、私は、このソリューションに到着しました。理想的ではないかもしれません。私は誰もが見るかもしれない問題についてのフィードバックを得たいです。

public void scrape() { 

    Try<Document> firstDocTry = this.getSearchResultsPage(Option.<Document>none().toTry()); (1) 

    // Generate a flux where each element in the flux is created using the current element 
    Flux.<Try<Document>, Try<Document>>generate(() -> firstDocTry, (docTry, sink) -> {   (2) 
      docTry = this.getSearchResultsPage(docTry); 
      docTry.isFailure() ? sink.complete() : sink.next(docTry); 
      return docTry; 
     }) 
     .flatMap(docTry -> this.transformToScrapedLoads(docTry))        (3) 
     .log() 
     .subscribe(scrapedLoad -> 
      scrapedLoadRepo.save(scrapedLoad)             (4) 
     ); 
} 

protected Try<Document> getSearchResultsPage(Try<Document> docTry) { 
    ... 
} 

protected Flux<ScrapedLoad> transformToScrapedLoads(Try<Document> docTry) { 
    ... 
} 

(1)ここでJavaslangのモナディックを試してみてください。 'firstDocTry'ジェネレータをシードします。 getSearchResultsPage()は、ドキュメントが提供されていない場合は、検索の最初のページから に開始します。

(2)ここで発電機を使用する。フラックス中に公開された各要素が前要素によって

を判断する(3)形質転換方法は、単一磁束

として加入を合わせて送信されるフラックス、(4)加入者が動作するには、各ドキュメントを変換しますFluxによって生成された各要素に適用されます。この場合、それらを持続させます。

関連する問題