いてづきブログ

情シスでやってみたことの備忘録

GASでSUUMOの検索結果を一覧で表示できるスクリプトを作った

7月に引っ越すにあたって引越し先の選定をしないといけないが、SUUMOで表示される内容を見やすく一覧で見るためにスクリプトを書いた。

ただしSUUMOにはAPIがないため、検索結果のURLを叩いて返ってきたレスポンスを解析するという手法を採っている。

そのため具体的なソースを載せることは控える。

 

 

スクリプトはGoogleAppsScriptを用いた。

標準でスケジュール実行の機能があることとスプレッドシートとの親和性が高いため向いている。*1

 

まずURLはSUUMOで最寄り駅や各種条件で検索を押した後に出てくる画面のURLをそのまま用いた。

パラメータが大量に設定されているが内容を逐一照合するのは面倒なことと一つでもパラメータが欠けていると結果が返ってこないためそのままコピペすることにした。

これをUrlFetchApp.fetchで叩く。

 

返ってきたレスポンスから詳細ページへのリンク部分を正規表現で抜き取る。

具体的には「chintai/jnc_xxxxxxxxxxxx?bc=xxxxxxxxxxxx」となっているものを抜き取る。

 

 

そうして得られた詳細ページを一つずつUrlFetchApp.fetchで叩き、返ってきたレスポンスから家賃や間取り等の情報を取得する。

しかし詳細ページのページ構成は同じclassのdivが多数使われているため、正面から正規表現で抜くのはかなり困難なためパーサーを使う。

今回は下記のものを使用した。

 

fromを少し多めに取ることで該当する部分の要素を抜き出すことが出来る。

 

こうして出来たのが下記のシートである。

 

家賃や間取り、面積等を一覧で見られるため比較がかなりやりやすくなった。

 

スクレイピングといえばPythonみたいなところがあるが、GoogleAppsScriptはこうして他のGoogleのプロダクトとの連携がしやすいところが最大の長所である。

 

 

 

 

*1:掲載情報は日々変わるため毎日最新を取得することにした

javaにvarが実装されたらしい

もうjavaは久しく触ってないですが。

 

togetter.com

 

var (型推論)が導入されていろいろ物議を醸しているみたい。

C#では10年も前に実装され、散々され尽くしたであろう議論がまた行われてるのを見てるといろいろと考えてしまう。

 

 

そこそこよく見かけるjava使いの人もvar否定的な感じだったりしてC#er的にはうーんと思ったり。

「読む時に読みづらい」というのを見かけるけど、これは多分慣れだと思うんだよなぁ。

C#でも結局ほとんどがvarで書かれてるし。

ただ、java10が使えない環境がたくさんあるというのは考える必要があるかもしれない。

 

 

あと、型推論について勘違いしてる人がいるけど、varで書いてもビルドの時点で型は確定する。

あくまで右辺から型が一意に決まるときのみ使えるのであって、そうでない時はそもそもビルドエラーになる。

javaScriptみたいに動かすまで型がわからないとかそういうことはない。

 

 

ちなみにMSDNではvarを使用しないほうがいい場合をコーディングルールで示しています(暗黙的に型指定されるローカル変数節)

javaでも参考になるのでは。

 

C# のコーディング規則 (C# プログラミング ガイド) | Microsoft Docs

 

 

 

独習C# 新版

独習C# 新版

 

 

Windows10の画面がセピア調になったときの対応

Win + Ctrl + Cを押下すれば直る。

 

具体的にはWindows10のカラーフィルターのショートカットになっているので、再度ショートカットを入力してフィルターをオフにしてやればいい。

f:id:iteduki:20180131094457p:plain

 

コピーしようとしたときにたまたま押下してしまって、ケーブルの接触とか疑って無駄に時間取られた…。

一回再起動したらロック画面は普通にカラーだったから気づけたけども。

せめてカラーフィルターがかかったことくらい表示してほしい。

 

Windows 10 でカラー フィルターを使用する

https://support.microsoft.com/ja-jp/help/4041722/windows-10-use-color-filters

ナンバープレートの正規表現

日本のナンバープレートの入力を正規表現で検証してみる。

 

こちらはGoogleフォームの検証機能で使用した。JavaScriptと同じ仕様?

Googleフォームで使用する場合は最初と最後の/を省く必要があるみたい。

 

これ↓

^[\u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf]+[a-zA-Z0-9]{1,3}[\u3040-\u309f]{1}[0-9]{1,4}$

 

入力例としては下記のようになる

品川100あ1234

 

順に、地名、分類番号、用途、一連指定番号をそれぞれ文字、3桁までの数字とアルファベットの組み合わせ、ひらがな1文字、4桁までの数字として検証している。

 

詳説 正規表現 第3版

詳説 正規表現 第3版

 

 

ObjectのArrayから要素を削除する

javascriptのarrayにはremoveはないのでspliceを使用する。

const ary = [1, 2, 3] ;

ary.splice(0, 1);

console.log(ary);  // [2, 3]

 

spliceは配列に対して、第1引数のindexから、第2引数の数だけ要素を排除する。

Array.prototype.splice() - JavaScript | MDN

 

なので、削除するためにはindexが必要。

値から削除するためにはindexOfを使う。

const ary = [1, 2, 3] ;

const index = ary.indexOf(1);  // 1を削除する

ary.splice(index, 1);

console.log(ary);  // [2, 3]

 

Objectの配列からオブジェクト内のフィールドの値を参照して削除したい場合、indexOfでは取得できないのでfindIndexを使う。

 

const ary = [{ key: 1, value: 'hoge'}, { key: 2, value: 'moge'}, {key:3, value: 'piyo'}];

const index = ary.findIndex(x => x.key === 1);

ary.splice(index, 1);

console.log(ary);  // [{key:2, value: 'moge'}, {key:3, value: 'piyo'}]

 

ただしfindIndexはIEでは動作しないことに注意。

Array.prototype.findIndex() - JavaScript | MDN

 

 

Vue.jsで苦戦

いろいろ調べてるけど、各記事によって作法がバラバラだし、そもそも.vueファイルに書くのか.jsに書くのかも定かじゃない記事ばかり。

 

たかがajaxで取ってきたデータで選択リストを作るところでさえこんなにわかりづらいとは…。

 

自分が全然わかってないからそう感じてるだけだろうけども。

まずは動いてるものを探してきて弄ったほうがいい気がする。