住所データから最寄り駅と徒歩時間を調べたい。実はここを使えば簡単に調べることができます。

Yahoo地図

しかし住所データが大量にあったらどうでしょうか? ひとつひとつ調べていては時間がかかります。そこでHTMLをしらべて一気に取得してしまいましょう。

このサイトもHTMLに直接検索結果が書かれているわけではありません。そこでSelenium.Chromeを使います。

F12キーを押して、ブラウザの開発ツール インスペクター/Elementsで調べてみると検索ボックスの周辺は以下のようになっています。

また検索をするために押すボタンは以下のようになっています。

最寄り駅が表示されている部分はこんな感じです。

結果が表示された場合は「閉じる」ボタンが表示されます。

ただ「あああ」のような住所ではないキーワードで検索した場合は最寄り駅は表示されないし、「閉じる」ボタンも表示されません。

住所で検索して最寄り駅が表示されるときのurlは

https://map.yahoo.co.jp/place?XXXXXXX

です。

これらがわかればなんとかできそうです。さっそく作成してみましょう。

まず住所データが大量に入力されたExcelファイルを作成します。入力されているのはA列だけです。また途中で空白行があったらデータはそこで終わりであるものとして扱います。

まずはExcelファイルから住所のリストを取得するメソッドをつくります。ClosedXMLを使うのでNugetでインストールしておきましょう。

取得したデータを格納するクラスをつくります。

次にNuGetでSelenium.WebDriverとSelenium.Support、そして操作したいブラウザのDriverをインストールします。今回はChromeを操作するのでSelenium.Chrome.WebDriverをインストールします。

ChromeDriverを生成したら、住所の文字列から最寄り駅の情報をリストで取得するGetDataSearchResultメソッドをつくります。この自作メソッドのなかで検索ワードを入力して検索ボタンをおすSearch(string str)メソッド(後述)、最寄り駅のリストを取得する GetStationInfos()メソッド(後述)を呼び出しています。

またページが読み込まれていないとボタンは押せないので実際にできるようになるまで1秒待機と実行を繰り返しています。

検索ワードを入力して検索ボタンを押すSearch(string str)メソッドを示します。ページが読み込まれていない場合は例外が発生するので1秒待ってもう一度やり直します(前述)。

最寄り駅情報を取得するGetStationInfos()メソッドを示します。これもページが読み込まれていない場合は例外が発生するので1秒待ってもう一度やり直します(前述)。

SaveExcelメソッドは取得されたResultのリストをファイルに保存するためのものです。新しくシートを作成してそこにデータを書き込みます。最寄り駅情報が取得できなかった場合は「データなし」と記録します。

実際に処理が進行しているのかどうかがわかるようにプログレスバーを表示させます。これまでに示したコードを少し変更します。

まず開始ボタンが押されたらファイル選択、データの取得などを行います。isDoingというフラグを使っていますが、これは終了するときに処理が完了したのかしていないのかが判断できるようにするためのものです(ChromeDriverをDisposeするときに必要)。