# cheerio-httpcliのfetchを使ってたら非同期プログラミングがよく分からなかった…笑

# このブログのスクレイピング

どうぶつの森で疲れたらプログラミングするようなユルいノリで進めているのですが(笑)、cheerio-httpcliでサイトマップに記載されている各URLにアクセスしてスクレイピングは出来たものの、fetchだと非同期でブワーっと行ってるようで、それを1個のJSONにまとめてAlgoliaに突っ込みたいだけなのに、async/awaitとかnew Promiseしてからresolveとかやっても、一向にまとまってくれる気配がない。笑

# というか、それ以前に…

そもそもcheerioのことを何もしらずに、ただググって出てきたコードをコピペしてやってるからこんなことになるんだろうな…笑

# nodeでbase64でエンコーディングする場合

ってことで、一旦fetchSyncで動くようにはしたのですが、👇ようなファンクションでJsonを作って、リターンを受け取った側で配列にしてAlgoliaにインデクシングしているのですが、

  json.objectID = new Buffer(loc, 'ascii').toString('base64');
  json.title = title;
  json.description = description;
  json.h2 = h2;
  json.h3 = h3;
  json.h4 = h4;
  json.p = p;
  json.lastmod = Date.parse(lastmod);

  return json;

URLをbase64にエンコーディングしてオブジェクトIDにしているところで、btoa()ってNode.jsでは動かないのですねぇ。ググったらBufferってのを使えって書いてあったので、まんまコピペでアレしてみたのですが、そしたら今度は**Buffer()はセキュリティ的にもアレだからBuffer.alloc(), Buffer.allocUnsafe(), or Buffer.from()**を使えと👇

(node:43490) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.

# ようやくAlgoliaの設定

とりあえず👇こんな感じにしています。

SearchableAttribute RankingSorting

AlgoliaのCustom RankingとSortingの違いとかどこかでまとめて資料にしようかなぁ。

ってか、各パラグラフは今のところ👇こんな風にHTMLのタグを取り除いてからガッチャンコしてから先頭の1000文字で切ってるのだけど、何文字くらいにしとくのが良いのかな。。

  result.$('p').each(function (idx) {
    p = p + result.$(this).text().replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, '');
  });
  p = p.substr(0, 1000);

# TODO

前回クロールしたタイムスタンプをファイルかどっかに取っておいて、lastmodがそれより新しいヤツだけをスクレイピングするようにすべきだなぁ。

んま、ぼちぼちやっていきます。

このエントリーをはてなブックマークに追加

Algolia検索からの流入のみConversionボタン表示