📚

TypeScript + Deno でスクレイピング

2024/02/06に公開

はじめに

tokadev です。札幌からリモートで開発しています。
冬になると交通機関のダイヤが更新されるので、この時期になると各交通機関のサイトで新しいダイヤを確認する必要があります。スクレイピングの季節ですね。

聞くところによると TypeScript + Deno でもスクレイピングが出来るそうなので試してみました。

Deno とは

DenoはRustで構築された JavaScript/TypeScript のためのランタイムです。

https://deno.com/

導入

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 でどんなことが出来るか調べてみるとサンプル集がありました。

https://examples.deno.land/

普段シェルスクリプトでやっているルーティン処理を Deno に置き換えてみるのも面白そうなので、別の機会に記事にしようと思います。

レスキューナウテックブログ

Discussion