goto-eater-data's People
goto-eater-data's Issues
大阪府のGeocodeError
DAMSが「大阪市東心斎橋」を「大阪市東区」と誤解釈するのが原因。「大阪市**区東心斎橋」なら正しく取れる。
これに限らずDAMSには「政令指定都市における区を略された場合に想定外の挙動になりがち」問題がある。むずかしい
{
"_ERROR": "GeocodeError",
"_dams_name": "",
"_dams_score": "",
"_dams_tail": "",
"_gsi_map_url": "",
"address": "大阪市東心斎橋1-6-10リップル周防町1F",
"area_name": "ミナミ",
"closing_day": "月曜日",
"detail_page": "https://goto-eat.weare.osaka-info.jp/gotoeat/%e3%82%a4%e3%82%bf%e3%83%a1%e3%82%b7%e3%83%a4%e3%80%80%e3%83%95%e3%82%b8/",
"genre_code": 3,
"genre_name": "イタリアン・フレンチ",
"google_map_url": "",
"lat": "",
"lng": "",
"normalized_address": "",
"official_page": "",
"opening_hours": "11:30-23:00",
"provided_lat": "",
"provided_lng": "",
"shop_name": "イタメシヤ フジ",
"tel": "06-6563-7991",
"zip_code": "542-0083"
}
大阪府の「珉珉上新庄駅前店」だけ店舗名が空になる
検索自体には引っかかるので謎(表示用のヘルパータグが文字コードエラーで落ちて空になってるとか?)
ちなみに他の「珉珉」については普通に表示されてたりする。(ただしミンミンとかの表記ゆれがある)
山口県でページ送りをすると重複して表示される場合がある
「エリアと料理で探す」をした結果をページ送りすると重複表示される場合がある。
https://gotoeat-yamaguchi.com/use/
内部的には#10 と同じ問題ではないかと思う。
ただ山口県は割とページ送りの最初の方でも重複が出ており、結果として200件くらい重複している。ソート順がそもそも何なのかいまいちわからない。
$ curl -sS "https://gotoeat-yamaguchi.com/use/page/[1-5]/?post_type=post&s" | grep '<h3><a href="https://gotoeat-yamaguchi.com/use/' | sort | uniq -d
<h3><a href="https://gotoeat-yamaguchi.com/use/4053/">居酒屋 ひなたぼっこ</a></h3>
<h3><a href="https://gotoeat-yamaguchi.com/use/5598/">旬菜KOUNOIKE</a></h3>
$ curl -sS "https://gotoeat-yamaguchi.com/use/page/[1-5]/?post_type=post&s" | grep '<h3><a href="https://gotoeat-yamaguchi.com/use/' | sort | uniq -d
<h3><a href="https://gotoeat-yamaguchi.com/use/1206/">のん太鮨 山口店</a></h3>
<h3><a href="https://gotoeat-yamaguchi.com/use/1327/">とろ麦 おのだサンパーク店</a></h3>
<h3><a href="https://gotoeat-yamaguchi.com/use/6048/">オリエンタルバール</a></h3>
$ curl -sS "https://gotoeat-yamaguchi.com/use/page/[1-5]/?post_type=post&s" | grep '<h3><a href="https://gotoeat-yamaguchi.com/use/' | sort | uniq -d
<h3><a href="https://gotoeat-yamaguchi.com/use/1456/">大衆酒場ひょうたん</a></h3>
<h3><a href="https://gotoeat-yamaguchi.com/use/5412/">油そば専門店「歌志軒」 山口小郡店</a></h3>
静岡県のGeocodeError
以下についてはDAMSでも期待通りに取れるはずだが、GeocodeErrorになっている原因は不明。後で調べる。
正しくは「静岡県駿東郡清水町伏見52−1 」なのでDAMSの結果はおそらく問題ないはず。
(全角ハイフンが区切り文字に入ってるのがやや気になる)
{
"_ERROR": "GeocodeError",
"_dams_name": "",
"_dams_score": "",
"_dams_tail": "",
"_gsi_map_url": "",
"address": "静岡県清水町伏見52-1サントムーン柿田川",
"area_name": "",
"closing_day": "",
"detail_page": "https://gotoeat.s-reserve.com/index/118031832.html",
"genre_code": 3,
"genre_name": "洋食",
"google_map_url": "",
"lat": "",
"lng": "",
"normalized_address": "",
"official_page": "",
"opening_hours": "",
"provided_lat": "",
"provided_lng": "",
"shop_name": "パタパタサントムーン店",
"tel": "055-9557-2122",
"zip_code": "411-0907"
},
以下の2件については、DAMSが入力内容の「静岡県清水区」を「静岡県清水市」(合併前の旧市名)と解釈してしまうのが原因。
なお、「静岡県静岡市清水区」が正しい。(清水市が静岡市と合併して清水区になった)
{
"_ERROR": "GeocodeError",
"_dams_name": "",
"_dams_score": "",
"_dams_tail": "",
"_gsi_map_url": "",
"address": "静岡県清水区草薙1-6-7岩崎ビル",
"area_name": "",
"closing_day": "",
"detail_page": "https://gotoeat.s-reserve.com/index/118019358.html",
"genre_code": 1,
"genre_name": "居酒屋",
"google_map_url": "",
"lat": "",
"lng": "",
"normalized_address": "",
"official_page": "http://www.tokkyu.com/",
"opening_hours": "",
"provided_lat": "",
"provided_lng": "",
"shop_name": "串特急草薙店",
"tel": "054-348-0261",
"zip_code": "424-0886"
},
{
"_ERROR": "GeocodeError",
"_dams_name": "",
"_dams_score": "",
"_dams_tail": "",
"_gsi_map_url": "",
"address": "静岡県清水区島崎町149河岸の市いちば館2F",
"area_name": "",
"closing_day": "",
"detail_page": "https://gotoeat.s-reserve.com/index/118009638.html",
"genre_code": 1,
"genre_name": "居酒屋",
"google_map_url": "",
"lat": "",
"lng": "",
"normalized_address": "",
"official_page": "http://www.surugasuisan.com",
"opening_hours": "",
"provided_lat": "",
"provided_lng": "",
"shop_name": "浜焼小屋馬鹿貝",
"tel": "054-355-5252",
"zip_code": "424-0823"
}
三重県、岐阜県の公式サイトで、詳細画面の電話番号のところだけテーブルタグが壊れてる
三重県に、住所中に店舗名が含まれるデータがある
https://area34.smp.ne.jp/area/card/26722/A7DYDE/M?S=lbrgkh0ljmc0k
ジオコーディングのときに邪魔になるので、暫定対応として、クローラ側で住所中に店舗名があったら削る処理を追加(2021/01/09)
群馬県にジャンル名が指定されていない店舗がある
特に困るわけではないが、群馬県の他データを見てると、一応ジャンル名必須っぽいので。
三重県に、住所が愛知県のデータが入っている
ドウシテ…
https://area34.smp.ne.jp/area/card/26722/B24Yg8/M?S=lbrgkh0qcs0k
https://area34.smp.ne.jp/area/card/26722/1CX5Bk/M?S=lbrgkh0tes0k
https://area34.smp.ne.jp/area/card/26722/ADJ0bk/M?S=lbrgkh0qcp0k
https://area34.smp.ne.jp/area/card/26722/cILT3K/M?S=lbrgkh0qck0k
https://area34.smp.ne.jp/area/card/26722/Gdp4A3/M?S=lbrgkh0qcm0k
https://area34.smp.ne.jp/area/card/26722/j6DWeB/M?S=lbrgkh0qcq0k
(現状、住所の正規化ロジックで「住所が指定された都道府県名で始まらない場合は追加する」みたいなのが入っているので、三重県中に「愛知県名古屋市…」みたいなのがあると「三重県」が補足されて「三重県愛知県名古屋市」みたいになっている。
ただこれは流石にどう考えても公式サイトのデータがおかしいんじゃないのか…?って気がするので保留)
福井県でジャンル指定がされてないデータがある
crawlerが大阪府で稀にリトライしきれずに504 Gateway Time-outになる
前も1回あり(2020-12-18 (金))、retry回数(settings.RETRY_TIMES)を2回→5回に増やして対応した記憶がある。
2021-01-06 03:42:40 [scrapy.downloadermiddlewares.retry] ERROR: Gave up retrying <GET https://goto-eat.weare.osaka-info.jp/gotoeat/page/685/?search_element_0_0=2&search_element_0_1=3&search_element_0_2=4&search_element_0_3=5&search_element_0_4=6&search_element_0_5=7&search_element_0_6=8&search_element_0_7=9&search_element_0_8=10&search_element_0_9=11&search_element_0_cnt=10&search_element_1_cnt=17&search_element_2_cnt=1&s_keyword_3&cf_specify_key_3_0=gotoeat_shop_address01&cf_specify_key_3_1=gotoeat_shop_address02&cf_specify_key_3_2=gotoeat_shop_address03&cf_specify_key_length_3=2&searchbutton=%E5%8A%A0%E7%9B%9F%E5%BA%97%E8%88%97%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B&csp=search_add&feadvns_max_line_0=4&fe_form_no=0> (failed 6 times): 504 Gateway Time-out
- scrapyはRETRY間隔(5秒後にリトライ等)については簡単に対応する方法がない
Exponential BackOff
ができれば最高なのだが…
大阪府の重複データ
70件近くあるのでページングの実装ミスを疑ったが、特にそうではなく、純粋にデータが二重登録されている。
$ curl -sS "https://goto-eat.weare.osaka-info.jp/gotoeat/page/[878-881]/?search_element_0_0=2&search_element_0_1=3&search_element_0_2=4&search_element_0_3=5&search_element_0_4=6&search_element_0_5=7&search_element_0_6=8&search_element_0_7=9&search_element_0_8=10&search_element_0_9=11&search_element_0_cnt=10&search_element_1_cnt=17&search_element_2_cnt=1&s_keyword_3&cf_specify_key_3_0=gotoeat_shop_address01&cf_specify_key_3_1=gotoeat_shop_address02&cf_specify_key_3_2=gotoeat_shop_address03&cf_specify_key_length_3=2&searchbutton=%E5%8A%A0%E7%9B%9F%E5%BA%97%E8%88%97%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B&csp=search_add&feadvns_max_line_0=4&fe_form_no=0" | grep '<p class="name">' | sort | uniq -d
「宮城県北部」を選択した場合に「仙台市」のデータが一部出てくるため、重複レコードになる
https://gte-miyagi.jp/available03.php
「インドネパール料理KR」ほか20件くらい
該当データは仙台区若林市でも出るため、結果として重複レコードになってしまう。
最初は「宮城県北部」に「仙台市」が含まれる仕様なのかな、と思ったが特にそんなこともなさそう。
参考:
$ curl -sS "https://gte-miyagi.jp/available03.php" | grep 仙台市
<li><a href="./available_aobaku.php">仙台市青葉区のお店</a></li> <li><a href="./available_miyaginoku.php">仙台市宮城野区のお店</a></li> <li><a href="./available_wakabayashiku.php">仙台市若林区のお店</a></li> <li><a href="./available_taihakuku.php">仙台市太白区のお店</a></li> <li><a href="./available_izumiku.php">仙台市泉区のお店</a></li> </ul>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-33-18</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-5-25遠見塚東2-32</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町3-10-10</span><br>
<span>住所: </span><span>〒984-0042<br>宮城県仙台市若林区大和町5-4-21</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-4-20</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-2-15</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-3-19</span><br>
<span>住所: </span><span>〒984-0042<br>宮城県仙台市若林区大和町4-13-25町田ビル1階**店舗</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-31-12</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町2-6-20</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-5-15グランマーレKMK</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町1-1-6</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-30-3赤から仙台大和町店</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町4-22-10名城タウンやまとB6</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町2-1-15たかろくビルⅡ 1階</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-4-20八島店舗D店</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町4-13-25</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町2-29-3</span><br>
<span>住所: </span><span>〒984-0042<br>宮城県仙台市若林区大和町5-5-25第二やしまビル一階</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-24-15</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-5-25</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町1-21-6</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町3-2-11</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-30-3</span><br>
<span>住所: </span><span>〒984-0042<br> 仙台市若林区 大和町5-30-15</span><br>
徳島県の公式サイトで複数地域名、複数ジャンル名指定して検索できない
これが原因で困ってることはないが、かなしい…
https://gotoeat.tokushima.jp/?category_name=%e7%9c%8c%e8%a5%bf%e9%83%a8+%e7%9c%8c%e5%8d%97%e9%83%a8
クエリパラメータを,区切りにする(?category_name=県西部,県南部)と一応データは取れてるような気がするが、正しいのかは不明。
島根県でページ送りをすると同じデータが表示される場合がある
事象
加盟飲食店一覧の検索結果において、
- ページ送りをすると同じデータが複数回表示されることがある。
- ページをリロードすると、違う内容が表示されることがある。
例:
https://www.gotoeat-shimane.jp/inshokuten/?page=28
https://www.gotoeat-shimane.jp/inshokuten/?page=29
※内部的にキャッシュが効いてるのか、問題ない場合もある
(いまいち再現性が不明、アプリケーションキャッシュかDBキャッシュが効いてるような気もする)
確認方法
curlで25〜35ページを取得、店舗名部分をpcre2grepで抽出して、重複を確認する。
(実行するたびに重複データは変わる)
$ brew install pcre2
$ curl -sS "https://www.gotoeat-shimane.jp/inshokuten/?page=[25-35]" | pcre2grep -M '<p class="title">\n.*' | sort | uniq -d
凡蔵
雷神
かどや
大正庵
田吾作
大はかや
好酒苑処 大虎
蔵カフェ おもひで屋
コーヒーショップ KEN
<p class="title">
原因
- 内部的にcreated_at, updated_atだけでorder byソートしている
- created_at, updated_atなどは同値をとり得る
- 一部RDBMSでは、同値カラムのオーダー順序は不定になる仕様
- 特にバッチ処理で一括してデータ投入していると、created_at, updated_atは同値になりやすい
- created_at, updated_atが同値の場合、クエリ結果が一意にならない
- limit&offsetの範囲を越えると(ページをまたがると)、(重複)表示される店舗と、まったく表示されない店舗がでてきてしまう
対策
- ORDER BYにサロゲートキー(id)を追加
- 例: ORDER BY created_at DESC,
id DESC
- created_atが同値でも、サロゲートキーでユニークにソート順が決まるため、結果は一意になり、ページごとの中身も一意になる
- 例: ORDER BY created_at DESC,
静岡(青券)で重複レコードがたくさんある
福島県でページ送りすると重複して表示される場合がある
たぶん以下と同件。最初の方のデータではおきない。
#10
$ curl -sS "https://gotoeat-fukushima.jp/shop/page/[90-91]/?s" | grep '店舗名' | sort | uniq -d
<li class="info-box"><span class="info-label">店舗名</span><span class="info-text">しゅんさい 鱗</span></li>
<li class="info-box"><span class="info-label">店舗名</span><span class="info-text">四ツ角 大正館</span></li>
<li class="info-box"><span class="info-label">店舗名</span><span class="info-text">酒場時遊人旬の会津</span></li>
鳥取県でページ送りをすると同じデータが表示される場合がある
https://tottori-gotoeat.jp/store_list/page/19/
目grepはつらいので、こんな感じでcURLで確認すると楽。
$ curl -sS "https://tottori-gotoeat.jp/store_list/page/[10-20]/" | grep "mr-3 d-inline-" | sort | uniq -d
<h2 class="mr-3 d-inline-block">39 berry farm</h2>
<h2 class="mr-3 d-inline-block">BAR虹</h2>
<h2 class="mr-3 d-inline-block">cafe&bakery APLICO</h2>
<h2 class="mr-3 d-inline-block">豪円</h2>
<h2 class="mr-3 d-inline-block">鉄板焼 蕾</h2>
<h2 class="mr-3 d-inline-block">海陽亭 道の駅きなんせ岩美店</h2>
<h2 class="mr-3 d-inline-block">茶田屋</h2>
<h2 class="mr-3 d-inline-block">食留芽</h2>
<h2 class="mr-3 d-inline-block">さんぽう</h2>
<h2 class="mr-3 d-inline-block">味処四季</h2>
<h2 class="mr-3 d-inline-block">ひょうたん</h2>
<h2 class="mr-3 d-inline-block">はちまん茶屋</h2>
<h2 class="mr-3 d-inline-block">らーめん大學</h2>
<h2 class="mr-3 d-inline-block">中華料理王福</h2>
<h2 class="mr-3 d-inline-block">みなとガーデン</h2>
<h2 class="mr-3 d-inline-block">創作居酒屋 耀</h2>
<h2 class="mr-3 d-inline-block">グリルダイバーnut'710</h2>
<h2 class="mr-3 d-inline-block">レークサイド大栄 やすらぎの家</h2>
<h2 class="mr-3 d-inline-block">有限会社ウイング</h2>
<h2 class="mr-3 d-inline-block">カフェコンフォート</h2>
<h2 class="mr-3 d-inline-block">牛ざんまい 鳥取店</h2>
<h2 class="mr-3 d-inline-block">薬膳カフェ真室茶荘</h2>
<h2 class="mr-3 d-inline-block">四六時中 米子駅前店</h2>
<h2 class="mr-3 d-inline-block">とっとり地魚菜や 酒楽</h2>
<h2 class="mr-3 d-inline-block">山陰うまいもんや 村尾</h2>
<h2 class="mr-3 d-inline-block">ベーカリー&カフェ「Bon*bon」</h2>
<h2 class="mr-3 d-inline-block">アジアンダイニング アガン</h2>
<h2 class="mr-3 d-inline-block">焼肉ホルモンきむら朝日町店</h2>
<h2 class="mr-3 d-inline-block">三代目網元魚鮮水産米子駅前店</h2>
<h2 class="mr-3 d-inline-block">日乃屋カレー米子鬼太郎空港店</h2>
<h2 class="mr-3 d-inline-block">焼肉ホルモンだんだん 米子駅前店</h2>
<h2 class="mr-3 d-inline-block">UCCカフェメルカード鳥取大丸店B1F</h2>
<h2 class="mr-3 d-inline-block">はなまるうどんイオンモール鳥取北店</h2>
<h2 class="mr-3 d-inline-block">イタリア食堂 ターナ・カプリッチョ</h2>
<h2 class="mr-3 d-inline-block">Cafe on the table</h2>
<h2 class="mr-3 d-inline-block">カレーハウスCoCo壱番屋米子皆生店</h2>
// 最近のデータだと出ない
$ curl -sS "https://tottori-gotoeat.jp/store_list/page/[1-5]/" | grep "mr-3 d-inline-" | sort | uniq -d
結果として重複レコードになってしまっているのと、場合によってはページングで表示されない店舗が出てきてしまうのが問題。
最初の方のデータではほぼ発生せず、後の方のデータでよく発生していることから、おそらく内部的にcreated_atとかupdated_atとかでOrder Byして検索結果を表示しており、そのへんが同値の場合(初期データをバッチで入れてた場合は同値になりがち)にソート順が不定となり、limit&offsetの間に挟まるとぬーん、、、という感じのやつじゃないかと思う。
order by に idかなんかを追加で入れてあげればいいんじゃないかと思います (的外れだったら申し訳ない)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.