# 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の設定
とりあえず👇こんな感じにしています。
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がそれより新しいヤツだけをスクレイピングするようにすべきだなぁ。
んま、ぼちぼちやっていきます。