食べログで指定した地点の近くの飲食店の一覧を取得する

会社の近くの飯屋をピックアップしたかったので。

import click

import scipy.optimize

import geopy.distance

import requests

import xml.etree.ElementTree as ET


def listup(lat, lon, radius_km):
    maxlat = scipy.optimize.bisect(lambda x: geopy.distance.distance((lat, lon), (x, lon)).km - radius_km, lat, 90)
    minlat = scipy.optimize.bisect(lambda x: geopy.distance.distance((lat, lon), (x, lon)).km - radius_km, -90, lat)
    maxlon = scipy.optimize.bisect(lambda x: geopy.distance.distance((lat, lon), (lat, x)).km - radius_km, lon, 180)
    minlon = scipy.optimize.bisect(lambda x: geopy.distance.distance((lat, lon), (lat, x)).km - radius_km, 0, lon)
    print(maxlat, minlat, maxlon, minlon)

    lst = 100
    params = {
        'maxLat': maxlat,
        'minLat': minlat,
        'maxLon': maxlon,
        'minLon': minlon,
        'lst': lst,
        'SrtT': 'trend',
    }

    pg = 1
    cnt = 9999
    rst_list = []
    while lst * (pg - 1) < cnt:
        params['pg'] = pg
        r = requests.get('https://tabelog.com/xml/rstmap', params=params)
        root = ET.fromstring(r.text)
        if pg == 1:
            cnt = int(root.find('srchinfo').attrib['cnt'])
        print('{:d} / {:d}'.format(min(cnt, lst * pg), cnt))
        for marker in root.findall('marker'):
            rst_list.append(marker.attrib)
        pg += 1

    return rst_list


@click.command
@click.argument('latitude', type=float)
@click.argument('longitude', type=float)
@click.option('--radius-km', type=float, default=0.5)
@click.option('--sort-by-score', is_flag=True)
def main(latitude, longitude, radius_km, sort_by_score):
    rst_list = listup(latitude, longitude, radius_km)
    if sort_by_score:
        rst_list = sorted(rst_list, key=lambda x: x['score'], reverse=True)
    for (i, rst) in enumerate(rst_list):
        print(rst['rstname'], end=' ')
        print('https://tabelog.com' + rst['rsturl'], end=' ')
        print(rst['rstcat'], end=' ')
        print(rst['holiday'], end=' ')
        print(rst['score'], end=' ')
        print('https://www.google.co.jp/maps?q={},{}'.format(rst['lat'], rst['lng']), end=' ')
        print()


if __name__ == '__main__':
    main()

こんな感じで動く。

$ python tabelog.py 35.697011 139.682878 --radius-km 0.1 --sort-by-score | head -n 10
華吉 https://tabelog.com/tokyo/A1319/A131903/13040836/ 中華料理、餃子 日曜日 3.55 https://www.google.co.jp/maps?q=35.69677753867941,139.6825075846003
カフェ デ カリー https://tabelog.com/tokyo/A1319/A131903/13130776/ カレー、カフェ 日曜日 3.50 https://www.google.co.jp/maps?q=35.697083182016286,139.68391515140476
ハイランダー イン トウキョウ https://tabelog.com/tokyo/A1319/A131903/13093730/ バー、パブ、ヨーロッパ料理 無し 3.44 https://www.google.co.jp/maps?q=35.697413738679,139.68246788460678
トリッペリア トリッパ https://tabelog.com/tokyo/A1319/A131903/13129637/ イタリアン、ワインバー 日 3.41 https://www.google.co.jp/maps?q=35.696570638679795,139.68326538459766
すし割烹悠水 https://tabelog.com/tokyo/A1319/A131903/13070320/ 海鮮、寿司、居酒屋 日曜日 3.38 https://www.google.co.jp/maps?q=35.6975662386793,139.68367858460743
坂上刀削麺 https://tabelog.com/tokyo/A1319/A131903/13188505/ 中華料理、刀削麺、居酒屋 無し(ビル休館日に準ずる) 3.38 https://www.google.co.jp/maps?q=35.697492738678896,139.68230588460767
麺家 たいせい https://tabelog.com/tokyo/A1319/A131903/13282456/ ラーメン なし 3.32 https://www.google.co.jp/maps?q=35.69720583867907,139.6822479846048
六味膳食 https://tabelog.com/tokyo/A1319/A131903/13161291/ 居酒屋、創作料理 日・祝日 (ご宴会予約のみやっています) 3.25 https://www.google.co.jp/maps?q=35.69620813868004,139.683320584594