🙆‍♀️

SUUMOで気になる物件を、全部Googleマップ上に表示する方法

に公開

はじめに

こんにちは!引っ越しの物件選びって大変ですよね。
そんな中で、物件の場所をマップで確認したいとき、いちいち住所をコピペして調べるのは面倒ですよね。
なので、気になる物件だけ全部マップ上に表示できるものを作りました(SUUMOに同じ機能があるけどね...)。

動作環境

GoogleChrome:127.0.6533.120(Official Build)(64 ビット)
OS:Windows10
CPU:Core i5-1135G7
メモリ:16GB

すること

  1. 下記3つのコードをコピーし、ブックマークのURLに追加する。名前は何でもよい。
    適当なページをブックマークに保存し、右クリックから編集で名前とURLを変える。
    ブックマークバーに保存しておくと便利。

①『地図ページへ遷移』コード

クリックでコードが表示されます
javascript:(function()%7B%2F%2F redirectToMapPage.js%0A%0A%2F%2F 現在のURLから物件コードを取得%0Afunction getPropertyCode() %7B%0A    var currentURL %3D window.location.href%3B%0A    var codeMatch %3D currentURL.match(%2F%5C%2Fchintai%5C%2F(jnc_%5Cd%2B)%5C%2F%3F%2F)%3B%0A    return codeMatch %3F codeMatch%5B1%5D %3A ''%3B%0A%7D%0A%0A%2F%2F 現在のURLから %3Fbc%3D パラメータを取得%0Afunction getBcParam() %7B%0A    var currentURL %3D window.location.href%3B%0A    var bcMatch %3D currentURL.match(%2F%5B%5C%3F%26%5Dbc%3D(%5B%5E%26%5D*)%2F)%3B%0A    return bcMatch %3F bcMatch%5B1%5D %3A ''%3B%0A%7D%0A%0A%2F%2F 地図・周辺環境ページに遷移%0Afunction redirectToMapPage() %7B%0A    var propertyCode %3D getPropertyCode()%3B%0A    var bcValue %3D getBcParam()%3B%0A    if (propertyCode %26%26 bcValue) %7B%0A        var mapPageURL %3D window.location.origin %2B '%2Fchintai%2F' %2B propertyCode %2B '%2Fkankyo%2F%3Fbc%3D' %2B bcValue%3B%0A        window.location.href %3D mapPageURL%3B%0A    %7D else %7B%0A        console.log('物件コードまたは bc パラメータが見つかりませんでした。')%3B%0A    %7D%0A%7D%0A%0A%2F%2F スクリプト実行%0AredirectToMapPage()%3B%7D)()%3B

②『物件追加』コード

クリックでコードが表示されます
javascript:(function()%7B%2F%2F JSONデータを含む <script> タグを取得%0Avar scriptElement %3D document.getElementById('js-gmapData')%3B%0A%0A%2F%2F 物件名を含む <h1> タグを取得%0Avar propertyNameElement %3D document.querySelector('.section_h1-header-title')%3B%0A%0A%2F%2F 現在のURLを取得%0Avar currentURL %3D window.location.href%3B%0A%0Aif (scriptElement %26%26 propertyNameElement) %7B%0A    %2F%2F スクリプトタグの内容を取得し、JSONとしてパース%0A    var jsonData %3D JSON.parse(scriptElement.textContent)%3B%0A%0A    %2F%2F 緯度と経度を取得%0A    var centerLat %3D jsonData.center.lat%3B%0A    var centerLng %3D jsonData.center.lng%3B%0A%0A    %2F%2F 物件名を取得%0A    var propertyName %3D propertyNameElement.textContent.trim()%3B%0A%0A    %2F%2F 保存するオブジェクトを作成%0A    var locationData %3D %7B%0A        name%3A propertyName%2C%0A        lat%3A centerLat%2C%0A        lng%3A centerLng%2C%0A        url%3A currentURL  %2F%2F URLを追加%0A    %7D%3B%0A%0A    %2F%2F ローカルストレージに保存されたデータを取得%0A    var savedLocations %3D JSON.parse(localStorage.getItem('locations')) %7C%7C %5B%5D%3B%0A%0A    %2F%2F 既に savedLocations がオブジェクト形式の場合は、新しい配列に変換する%0A    if (!Array.isArray(savedLocations)) %7B%0A        var convertedArray %3D %5B%5D%3B%0A        for (var key in savedLocations) %7B%0A            if (savedLocations.hasOwnProperty(key)) %7B%0A                convertedArray.push(savedLocations%5Bkey%5D)%3B%0A            %7D%0A        %7D%0A        savedLocations %3D convertedArray%3B%0A    %7D%0A%0A    %2F%2F 新しいデータを追加%0A    savedLocations.push(locationData)%3B%0A%0A    %2F%2F 更新されたデータをローカルストレージに保存%0A    localStorage.setItem('locations'%2C JSON.stringify(savedLocations))%3B%0A%0A    %2F%2F 成功メッセージをページに表示%0A    var messageDiv %3D document.createElement('div')%3B%0A    messageDiv.textContent %3D 'データがローカルストレージに保存されました%3A ' %2B%0A                             '物件名%3A ' %2B propertyName %2B '%2C ' %2B%0A                             '緯度%3A ' %2B centerLat %2B '%2C ' %2B%0A                             '経度%3A ' %2B centerLng %2B '%2C ' %2B%0A                             'URL%3A ' %2B currentURL%3B%0A    messageDiv.style.position %3D 'fixed'%3B%0A    messageDiv.style.top %3D '10px'%3B%0A    messageDiv.style.right %3D '10px'%3B%0A    messageDiv.style.backgroundColor %3D '%23dff0d8'%3B%0A    messageDiv.style.color %3D '%233c763d'%3B%0A    messageDiv.style.padding %3D '10px'%3B%0A    messageDiv.style.border %3D '1px solid %23d6e9c6'%3B%0A    messageDiv.style.borderRadius %3D '5px'%3B%0A    messageDiv.style.zIndex %3D '1000'%3B %2F%2F 他の要素の上に表示%0A    document.body.appendChild(messageDiv)%3B%0A%0A    %2F%2F 5秒後にメッセージを消す%0A    setTimeout(function() %7B%0A        document.body.removeChild(messageDiv)%3B%0A    %7D%2C 5000)%3B%0A%7D else %7B%0A    console.log('指定された要素が見つかりませんでした。')%3B%0A%7D%7D)()%3B

③『CSV保存』コード

クリックでコードが表示されます
javascript:(function()%7Bfunction downloadCSVFile(content%2C fileName) %7B%0A    var a %3D document.createElement("a")%3B%0A    var file %3D new Blob(%5Bcontent%5D%2C %7B type%3A 'text%2Fcsv' %7D)%3B%0A    a.href %3D URL.createObjectURL(file)%3B%0A    a.download %3D fileName%3B%0A    a.click()%3B%0A%7D%0A%0A%2F%2F ローカルストレージから緯度と経度、物件名、URLを取得%0Avar savedLocations %3D JSON.parse(localStorage.getItem('locations')) %7C%7C %5B%5D%3B%0A%0A%2F%2F 重複を排除するためのセット%0Avar uniqueLocations %3D new Set()%3B%0A%0A%2F%2F 重複しないデータを集めるための配列%0Avar uniqueLocationArray %3D %5B%5D%3B%0A%0A%2F%2F 各データをチェックして重複を排除%0AsavedLocations.forEach(function(location) %7B%0A    var locationKey %3D %60%24%7Blocation.name%7D%2C%24%7Blocation.lat%7D%2C%24%7Blocation.lng%7D%2C%24%7Blocation.url%7D%60%3B%0A    if (!uniqueLocations.has(locationKey)) %7B%0A        uniqueLocations.add(locationKey)%3B%0A        uniqueLocationArray.push(location)%3B%0A    %7D%0A%7D)%3B%0A%0A%2F%2F CSVのヘッダー%0Avar csvContent %3D "物件名%2C緯度%2C経度%2CURL%5Cn"%3B%0A%0A%2F%2F 各データをCSV形式に変換%0AuniqueLocationArray.forEach(function(location) %7B%0A    csvContent %2B%3D %60"%24%7Blocation.name%7D"%2C%24%7Blocation.lat%7D%2C%24%7Blocation.lng%7D%2C"%24%7Blocation.url%7D"%5Cn%60%3B%0A%7D)%3B%0A%0A%2F%2F CSVファイルをダウンロード%0AdownloadCSVFile(csvContent%2C 'locations.csv')%3B%7D)()%3B


名前をつけ、URLにコードを張り付ける


3つそれぞれ行い、ブックマークバーに保存した例

  1. SUUMOで物件を表示する

  2. 『地図ページへ遷移』ブックマークをクリックし、地図・周辺環境ページへ移動する

  3. 『物件追加』ブックマークをクリックし、物件情報を保存する(保存に成功すると、画面上部にメッセージが表示される)

  4. 上記2.3.4を好きなだけ行う(必ず2.3.4の順番で行う)

  5. 『CSV保存』ブックマークをクリックし、csvファイルをパソコンに保存する(locations.csvで保存される)

  1. Googleマイマップを表示し、「新しい地図を作成→CREATE→レイヤーを追加→インポート」と進み、先ほどのcsvファイルをインポートする

  2. 緯度と経度を設定し、マーカーのタイトルに物件名を選択する

  3. マップ上に物件が全て表示される

簡単に解説

  1. SUUMOの物件情報から物件名・緯度・経度・URLを取得し、ローカルストレージに保存する
  2. ローカルストレージの物件情報をcsv形式に変換しダウンロードする
  3. googleマイマップでcsvを読み込ませて終わり

最後に

本当は『地図ページへ遷移』と『物件追加』プログラムを一緒にしたかったんですけどね...
地図ページへ遷移した時にURLが変わるので、コンソールがリセットされて物件追加コードが動かないんですよね。解決策知ってる方いましたら教えてください。
 あと、ブックマークレット初めて使いましたが便利ですね、これ。コードの書き方とかコンパイラとか色々勉強になりました。下にコンパイル前のJavascript置いておきますので自由に使ってください。

コンパイラ:https://caiorss.github.io/bookmarklet-maker/

①『地図ページへ遷移』コード

クリックでコードが表示されます
// 現在のURLから物件コードを取得
function getPropertyCode() {
    var currentURL = window.location.href;
    var codeMatch = currentURL.match(/\/chintai\/(jnc_\d+)\/?/);
    return codeMatch ? codeMatch[1] : '';
}

// 現在のURLから ?bc= パラメータを取得
function getBcParam() {
    var currentURL = window.location.href;
    var bcMatch = currentURL.match(/[\?&]bc=([^&]*)/);
    return bcMatch ? bcMatch[1] : '';
}

// 地図・周辺環境ページに遷移
function redirectToMapPage() {
    var propertyCode = getPropertyCode();
    var bcValue = getBcParam();
    if (propertyCode && bcValue) {
        var mapPageURL = window.location.origin + '/chintai/' + propertyCode + '/kankyo/?bc=' + bcValue;
        window.location.href = mapPageURL;
    } else {
        console.log('物件コードまたは bc パラメータが見つかりませんでした。');
    }
}

// スクリプト実行
redirectToMapPage();

②『物件追加』コード

クリックでコードが表示されます
// JSONデータを含む <script> タグを取得
var scriptElement = document.getElementById('js-gmapData');

// 物件名を含む <h1> タグを取得
var propertyNameElement = document.querySelector('.section_h1-header-title');

// 現在のURLを取得
var currentURL = window.location.href;

if (scriptElement && propertyNameElement) {
    // スクリプトタグの内容を取得し、JSONとしてパース
    var jsonData = JSON.parse(scriptElement.textContent);

    // 緯度と経度を取得
    var centerLat = jsonData.center.lat;
    var centerLng = jsonData.center.lng;

    // 物件名を取得
    var propertyName = propertyNameElement.textContent.trim();

    // 保存するオブジェクトを作成
    var locationData = {
        name: propertyName,
        lat: centerLat,
        lng: centerLng,
        url: currentURL  // URLを追加
    };

    // ローカルストレージに保存されたデータを取得
    var savedLocations = JSON.parse(localStorage.getItem('locations')) || [];

    // 既に savedLocations がオブジェクト形式の場合は、新しい配列に変換する
    if (!Array.isArray(savedLocations)) {
        var convertedArray = [];
        for (var key in savedLocations) {
            if (savedLocations.hasOwnProperty(key)) {
                convertedArray.push(savedLocations[key]);
            }
        }
        savedLocations = convertedArray;
    }

    // 新しいデータを追加
    savedLocations.push(locationData);

    // 更新されたデータをローカルストレージに保存
    localStorage.setItem('locations', JSON.stringify(savedLocations));

    // 成功メッセージをページに表示
    var messageDiv = document.createElement('div');
    messageDiv.textContent = 'データがローカルストレージに保存されました: ' +
                             '物件名: ' + propertyName + ', ' +
                             '緯度: ' + centerLat + ', ' +
                             '経度: ' + centerLng + ', ' +
                             'URL: ' + currentURL;
    messageDiv.style.position = 'fixed';
    messageDiv.style.top = '10px';
    messageDiv.style.right = '10px';
    messageDiv.style.backgroundColor = '#dff0d8';
    messageDiv.style.color = '#3c763d';
    messageDiv.style.padding = '10px';
    messageDiv.style.border = '1px solid #d6e9c6';
    messageDiv.style.borderRadius = '5px';
    messageDiv.style.zIndex = '1000'; // 他の要素の上に表示
    document.body.appendChild(messageDiv);

    // 5秒後にメッセージを消す
    setTimeout(function() {
        document.body.removeChild(messageDiv);
    }, 5000);
} else {
    console.log('指定された要素が見つかりませんでした。');
}

③『CSV保存』コード

クリックでコードが表示されます
function downloadCSVFile(content, fileName) {
    var a = document.createElement("a");
    var file = new Blob([content], { type: 'text/csv' });
    a.href = URL.createObjectURL(file);
    a.download = fileName;
    a.click();
}

// ローカルストレージから緯度と経度、物件名、URLを取得
var savedLocations = JSON.parse(localStorage.getItem('locations')) || [];

// 重複を排除するためのセット
var uniqueLocations = new Set();

// 重複しないデータを集めるための配列
var uniqueLocationArray = [];

// 各データをチェックして重複を排除
savedLocations.forEach(function(location) {
    var locationKey = `${location.name},${location.lat},${location.lng},${location.url}`;
    if (!uniqueLocations.has(locationKey)) {
        uniqueLocations.add(locationKey);
        uniqueLocationArray.push(location);
    }
});

// CSVのヘッダー
var csvContent = "物件名,緯度,経度,URL\n";

// 各データをCSV形式に変換
uniqueLocationArray.forEach(function(location) {
    csvContent += `"${location.name}",${location.lat},${location.lng},"${location.url}"\n`;
});

// CSVファイルをダウンロード
downloadCSVFile(csvContent, 'locations.csv');

Discussion