← Portfolio

Data Engineering · End-to-end project

Outlet Finder

A crawler that collects bars and restaurants from public listings, cleans and de-duplicates them, and flags outlets it hasn't seen before: the kind of pipeline a field sales team uses to find venues missing from their customer list.

This demo runs a short, polite crawl of three Tokyo areas (Ginza, Roppongi and Shinjuku) and stores everything in Google Cloud Storage. Below is the latest run.

1

Scrape

Scrapy spiders crawl area result pages and follow links to each outlet's page, pulling the name and address with XPath. Built to be a good citizen: robots.txt obeyed, 10 seconds between requests, and a hard stop after 100 pages.

Live runs from this page are coming soon. Last run finished 2026-09-24 20:41 UTC.
115
pages fetched (the crawl stops at about 100)
55
outlet listings extracted
23.4
minutes crawling (mostly the polite delay)
1
runs so far
2

Model

Raw listings are messy: the same bar shows up twice, full-width and half-width characters mix, and one address is written 銀座七丁目8番12号 while another says 銀座7-8-12 5F. The model step:

  1. Normalizes text (Unicode NFKC) and Japanese address forms (丁目/番地/号 → hyphens, kanji numerals → digits).
  2. Parses ward and neighbourhood, and strips building/floor so addresses compare cleanly.
  3. De-duplicates: exact matches first, then fuzzy name matching at the same address.
  4. Compares against every outlet from earlier runs to flag what's new.
This run, step by step
Listings scraped
55
Missing name or address
0
Exact duplicates
0
Fuzzy duplicates (same place, different spelling)
0
Unique outlets
55
Already known from earlier runs
0
New outlets
55
New this run
OutletAreaAddress
完全個室居酒屋 九州さつき 六本木店Roppongi港区六本木3-11-10 ココ六本木ビル4階
しゃぶしゃぶ温野菜 六本木店Roppongi港区六本木7-13-6 コンドウビル2・3F
貸切パーティースペース FLARE(フレア)六本木ミッドタウン前Roppongi港区六本木7-9-2 岡野ビル2F
魅弥美Roppongi港区六本木3-12-5 ステラビル1F
BIANCHIRoppongi港区六本木7-17-19 TRUST VALUE 六本木7-2F
TLAX Bar&Dining(トラックス バー アンド ダイニング)六本木Roppongi港区六本木7-13-5 萩原ビル3階
ダイニングバー ちゃちゃちゃ 六本木店Roppongi港区六本木3-15ベル六本木4階
貸切パーティー×個室REBARKRoppongi港区六本木4-5-9 トリニティビル2 2F
クラフトビール×ダイニング VINYL HOUSE 六本木植物園Roppongi港区六本木5-3-2
Darts UP(ダーツアップ) 六本木2号店Roppongi港区六本木7-14-6 ゆきざきビル 7F
シュラスコBBQ食べ放題 マリブ MALIBU 新宿最大級のビアガーデンShinjuku新宿区歌舞伎町1-21-1 第二東亜会館ビル 屋上
牛串ろっきー2 銀座店Ginza港区新橋1-5-5 グランベル銀座2 1F
本格中華 蒙古薬膳しゃぶしゃぶ小尾羊 銀座店Ginza中央区銀座8-9-15 JEWEL BOX GINZA 10F
宴会/貸切/接待利用歓迎本格中国湖南料理 洞庭 DongTing GinzaGinza中央区銀座7-8-1 銀座梅林ビル6F
貸切・パーティー artia Ginza(アーティア銀座)Ginza中央区銀座1-6-10 5F
Tapas&Wine 銀座ZIONGinza中央区銀座5-9-1 銀座コティビル地下1階
銀座しゃぶ輝 銀座駅前店 完全個室 黒毛和牛しゃぶしゃぶ・すき焼き専門店Ginza中央区銀座5-9-5 チア-ズ銀座8F
バル酒場 イタリアン 銀座5丁目店Ginza中央区銀座5-14-1 銀座クイントビル B1F
CHEESE KITCHEN RACLER (チーズキッチン ラクレ)銀座Ginza中央区銀座2-2-14 マロニエゲ-ト銀座1
シュラスコ&ビアバー ゴッチバッタ銀座Ginza中央区銀座8-2-1 ニッタビル7階(区画:7-2)
スペインクラブ銀座Ginza中央区銀座7-12-14 大栄会館
馬菜 BASAI 銀座本店Ginza中央区銀座3-9-4草野ビルB1
近江うし焼肉 にくTATSU銀座店 ランチ×接待×完全個室Ginza中央区銀座5-7-6 I liv 15F
貸切・パーティー ビストロカツキ銀座本店Ginza中央区銀座7-11-12 相鉄フレッサイン銀座7-2階
串の坊 銀座六丁目店Ginza中央区銀座6-2-6 ウエストビル1F
銀座 かく悟Ginza中央区銀座8-5-5 LSRビルディング2階
銀座方舟 大吟醸いろりGinza中央区銀座8-8-8 GINZA888ビル 7階
あなご屋 銀座ひらいGinza中央区銀座5-9-5 長屋104
銀座 肉流Ginza中央区銀座2-4-6 ベルビア館8階
国産黒毛和牛 焼肉 福々(FUKUFUKU)銀座本店 銀座8丁目Ginza中央区銀座8-10-7 東成ビルB1F
ワイン村シャガールGinza中央区銀座8-5-10 金成ビル1F
銀座 個室 沖縄豚しゃぶ サムギョプサル 美ら菜苑Ginza中央区銀座7-7-7 GINZA777 4F
鉄板和食とおばんざい 亀八 銀座Ginza中央区銀座7-5-4 ラヴィア-レ6F
味の中華 羽衣 銀座本店 銀座 中華Ginza中央区銀座7-12-14 大栄会館B1
鮨処 銀座福助 本店Ginza中央区銀座2-6-5 銀座トレシャス 10F
Yakiniku Ginza 焼肉 銀座 小六Ginza中央区銀座7-6-10 アソルティ銀座 花椿通りビル 8F
銀座 羅豚 はなれGinza中央区銀座8-10-8銀座8-10-ビル1F
Dining Bar GINZA 1986Ginza中央区銀座8-7-2 永寿ビル 4F
銀座方舟 大吟醸しずくGinza中央区銀座8-8-8 GINZA888ビル 6F
貸切パーティー JASMINE(ジャスミン) 銀座Ginza中央区銀座7-2-14 第26ポ-ルスタ-ビル3F
神戸ビフテキのカワムラ 銀座Ginza中央区銀座6-5-6 銀座美術館ビル10F11F
焚膳Ginza中央区銀座7-108-先銀座コリド-街117
Sun-mi ( サンミ ) 本店 香川Ginza中央区銀座6-3-9 4F
麹蔵 銀座店Ginza中央区銀座3-4-6 正隆銀座ビルB1
旨い蟹と鮪の店 海の達磨 銀座本店Ginza中央区銀座7-3-13 ニュ-ギンザビル B1F
生ラムかんな 銀座コリドー街店Ginza中央区銀座7-2 山下ビル116室
Ginza NGinza中央区銀座7-6-11ミクニギンザセブンビル4階
酒菜庵 ちゃぼうず 銀座店Ginza中央区銀座1-4-6 ナスダビル2F
GINZA Vermillion(バーミリオン)Ginza中央区銀座6-12-16 銀座片桐ビル2 4F
焼肉 銀座コバウ 特別室Ginza中央区銀座6-7-6 ラペビル 8F
3

What's been collected

55
unique outlets in the database
7.2 MB
of raw HTML archived (55 pages)
18.9 KB
of structured JSON (2 files)
388×
more bytes of HTML than of the data actually kept
Outlets in the database after each run

total known added by that run

first runlatest
By area
Ginza
43
Roppongi
10
Shinjuku
1
Other
1
4

Coming soon: plan a sales route

Pick Ginza, Roppongi or Shinjuku, see the outlets nearby on a map, and get the best order to visit them, with sample sales figures for each stop.

Stack: Python · Scrapy · Google Cloud Storage · Django on App Engine. Only outlet names and addresses are kept.