1

私は小さなWeb Scrapperを構築しています。私のアプリケーションでは、Webサイトのさまざまな部分をスクラップして情報を入力する必要があります。データベース。時には重複したエントリなどの狂った結果を出すこともあるし、関数getPhoto()から未定義を返すこともある。しかし、私はその関数を呼び出すだけで(スクリプトの残りの部分を実行しない)、正しい結果を返します!Meteorは関数からの結果を待つことなく、未定義を返します

私はforループを持っていますが、これは別のURLをループします。各URLに移動し、次の情報をスクラップします:1.タイトル、2.記述、内部リンク、4.タイトル(getPhoto(...))に従って画像を生成する関数を呼び出します。結果はDBに保存されます。すべてが異なるURLが含まれてい

for (i = 0; i < AllLinks.length; i++) { 

    if (AllLinks[i] != undefined && AllLinks[i] != null && sepLink[2] == "www.fly4free.pl") { 

    var t2 = { 
     travelTitle: null, 
     travelTitle2: null, 
     travelTitle3: null, 
     travelDescription: null, 
     travelDescription2: null, 
     travelDescription3: null, 
     travelBuy: null, 
     travelBuy2: null, 
     travelImage: null 
    }; 

    var TravelLink1 = AllLinks[i]; 

    result = HTTP.get(AllLinks[i], {}); 
    $ = cheerio.load(result.content); 

    t2.travelTitle = $('.article__title').text(); 
    t2.travelDescription = $('.article__content').find('p').first().text(); 

    if ($("img[src$='//www.fly4free.pl/wp-content/uploads/2016/09/lotJm.png']").parent().attr('href') != null) { 
     t2.travelBuy = $("img[src$='//www.fly4free.pl/wp-content/uploads/2016/09/lotJm.png']").parent().attr('href'); // Link to buy 
    } 

    if (t2.travelBuy) { 
     if (t2.travelBuy.split('https://').pop().split('http://').pop() != null) { 
     t2.travelBuy2 = t2.travelBuy.split('https://').pop().split('http://').pop(); // link ready for DB 
     } else { 
     t2.travelBuy2 = t2.travelBuy; 
     } 
    }   

    t2.travelTitle3 = convertCurrencyInText(t2.travelTitle, 'PLN'); 
    t2.travelDescription3 = convertCurrencyInText(t2.travelDescription, 'PLN'); 

    translate(t2.travelTitle3, {from: 'pl', to: 'en'}).then(res => { 
     t2.travelTitle2 = res.text; // title for DB 
     if (t2.travelTitle2) { t2.travelImage = getPhoto(t2.travelTitle2); } 

     translate(t2.travelDescription3, {from: 'pl', to: 'en'}).then(response => { 
     t2.travelDescription2 = response.text; // description for DB 

     if (t2.travelDescription2 != null && t2.travelTitle2 != null && t2.travelBuy2 != null && TravelLink1 != null && t2.travelImage != null) { 
      Links.insert({ title: t2.travelTitle2, description:t2.travelDescription2, image: t2.travelImage, buyLink:t2.travelBuy2, link: TravelLink1, datetime: new Date() }); 
     } 

     }).catch(err => { 
     console.error(err); 
     }); 

    }).catch(err => { 
     console.error(err); 
    }); 

    } 

} 

「AllLinks」(私はcronジョブ、ないクライアントとの対話を使用しています)サーバーで発生します。私はこのURLをこする問題を抱えている:http://www.fly4free.pl/na-wakacje-do-toskanii-tanie-loty-do-pizy-z-gdanska-za-170-pln/

getPhoto()関数

私は結果をログコンソールしよう
function getPhoto(title) { 

    var travelPlace = nlp(title).match('to *').out('text').replace('to','').trim(); 
    if (travelPlace) {var travelPlace2 = travelPlace.split(' '); } 
    if (travelPlace2) {var travelPlace3 = travelPlace2[0] + "+" + travelPlace2[1]; } 
    if (travelPlace3) { 
    var URL = "https://pixabay.com/api/?key="+API_KEY+"&q="+travelPlace3+"&category=travel&orientation=horizontal"; 
    var images = (HTTP.get(URL, {})); 

    if (images.data.totalHits > 0) { 
     var imageLink = images.data.hits[0].webformatURL; 
     return imageLink; 

    } else if (images.data.totalHits == 0) { 
     var URL = "https://pixabay.com/api/?key="+API_KEY+"&q="+travelPlace2[0]+"&category=travel&orientation=horizontal"; 
     var images = (HTTP.get(URL, {})); 

     if (images.data.totalHits > 0) { 
     var imageLink = images.data.hits[0].webformatURL; 
     return imageLink; 
     } 

    } 
    } else if (nlp(title).places().data().length > 0) { 
    var result = nlp(title).places().data()[0].text.replace(/[^a-zA-Z ]/g, "").trim(); 
    var URL = "https://pixabay.com/api/?key="+API_KEY+"&q="+result+"&category=travel&orientation=horizontal"; 
    var images = (HTTP.get(URL, {})); 

    if (images.data.totalHits > 0) { 
     var imageLink = images.data.hits[0].webformatURL; 
     return imageLink; 
    } 

    } else { 
    var title2 = title.replace(/[^a-zA-Z ]/g, "").split(" "); 
    if (title2) { 
     for(i = 0; i < title2.length; i++) { 

     if (cities[title2[i]] == 1) { 

      var URL = "https://pixabay.com/api/?key="+API_KEY+"&q="+title2[i]+"&category=travel&orientation=horizontal"; 
      var images = (HTTP.get(URL, {})); 

      if (images.data.totalHits > 0) { 
      var imageLink = images.data.hits[0].webformatURL; 
      return imageLink; 
      } 

     } else { 

      var URL = "https://pixabay.com/api/?key="+API_KEY+"&q=travel&category=travel&orientation=horizontal"; 
      var images = (HTTP.get(URL, {})); 

      if (images.data.totalHits > 0) { 
      var imageLink = images.data.hits[0].webformatURL; 
      return imageLink; 
      } 


     } 
     } 
    } 
    } 

} 

- 時々私は、getPhoto()から正しい画像を取得するが、t2.travelBuyから未定義のリンク、時にはその逆もあります。私が間違っていることを教えてくれますか?私は何人かの人々がその種の問題について約束または非同期/機能を待っているのを見ました。それが私を助けるだろうと思いますか? 「定義されていない」ことなくウェブサイトを擦るためにコードをどのように変更すればよいですか?

「グーグル翻訳-API」から来ている「翻訳」パッケージ

+2

正直言ってあなたのすべてを読んでいないのですが、短い答えは非同期問題のようです。約束を返すか、データを設定する関数のコールバックに適切なデータが得られていない関数を置きます。 – dlsso

答えて

0

あなたはVaRのnew_func = Meteor.wrapAsync(CALLBACKを持っているあなたの関数)を試すことができますし、new_funcを使用するときに()、それは結果を返しますあなたがコールバックを待つのではなく通常の機能から期待する通り

+0

私の関数にはコールバックがありません。どうすればそれらを変更できますか? –

+0

HTTP.getコールバックがありますが、サーバーで省略することはできますが、エラーを取得するには、代わりにそれをキャッチする必要があります – Potato

+0

'try { const result = HTTP.call( 'GET'、 'http://api.twitter .com/xyz '、{ params:{user:userId} }); がtrueを返します。 } catch(e){ // 400または500の範囲でネットワークエラー、タイムアウト、またはHTTPエラーが発生しました。 falseを返します。 } ' – Potato

関連する問題