📚
TypeScript + Deno でスクレイピング
はじめに
tokadev です。札幌からリモートで開発しています。
冬になると交通機関のダイヤが更新されるので、この時期になると各交通機関のサイトで新しいダイヤを確認する必要があります。スクレイピングの季節ですね。
聞くところによると TypeScript + Deno でもスクレイピングが出来るそうなので試してみました。
Deno とは
DenoはRustで構築された JavaScript/TypeScript のためのランタイムです。
導入
homebrew や scoop で導入できます。
$ brew install deno
$ deno --version
deno 1.40.3 (release, aarch64-apple-darwin)
v8 12.1.285.6
typescript 5.3.3
準備
今回は例として、札幌市交通局のサイトから 南北線大通駅 の時刻表を抽出します。
実装
時刻表が掲載されているページからリソースを取得、テキスト情報を返します。
その後、取得したテキストを DOMParser
を介してDOMオブジェクトにします。
あとは querySelector()
等を利用して時刻表データを抽出します。便利ですね。
scraping.ts
import { DOMParser } from 'https://esm.sh/linkedom';
const url = 'https://www.city.sapporo.jp/st/subway/route_time/h26/n07.html';
fetch(url)
.then((response) => response.text())
.then((text) => {
const document = new DOMParser().parseFromString(text, 'text/html');
const elements = document?.getElementsByTagName('tr');
for (const el of elements) {
console.info(el.querySelector('th').textContent);
console.info(el.querySelector('td > p').textContent);
}
})
.catch((err) => console.error(err));
実行
Deno は TypeScript をスクリプトとして実行することができます。
deno run [option] [file]
の形式で実行します。
今回はネットワークアクセスを許可するため --allow-net
オプションを追加します。
$ deno run --allow-net scraping.ts
6時
00 10 20 30 39 48 57
7時
06 14 21 29 33 37 41 45 50 54 58
...(省略)
無事時刻表の抽出が出来ました。お疲れ様でした。
別途 json 等でファイル出力する場合は --allow-write
オプションでパーミッションを追加しましょう。
おわりに
スクレイピング以外にも Deno でどんなことが出来るか調べてみるとサンプル集がありました。
普段シェルスクリプトでやっているルーティン処理を Deno に置き換えてみるのも面白そうなので、別の機会に記事にしようと思います。
Discussion