[PYTHON] Ordnen Sie die für die GoToEat-Kampagne bestimmten Geschäfte zu und genießen Sie sie

Einführung

Ich war an der GoToEat-Kampagne interessiert, weil sie ein heißes Thema im vogelaristokratischen Marathon wurde. Dieses Mal möchte ich Pythons Scraping- und Mapping-Techniken verwenden, um die für die Kampagne bestimmten Stores zuzuordnen. GoToEat-Kampagnenseite des Ministeriums für Land- und Forstwirtschaft und Fischerei

Nutzungsdaten

Wir haben Informationen gesammelt, indem wir die Seite von Geschäfte, die für die Lebensmittelprotokollkampagne bestimmt sind durchsucht haben.

Auf den ersten Blick konnte ich den Wortlaut nicht finden, dass das Schaben auf der Website verboten war ...

Ich werde diesmal den Scraping-Quellcode weglassen und nur einen Überblick geben. Die zu erfassenden Informationen sind ['Geschäftsname', 'Genre', 'Überprüfungsrate', 'Mindestbudget', 'Telefonnummer', 'Rauchinformationen', 'Adresse', 'Präfektur', 'Vorwahl', 'URL ']Wird besorgt.

tabelog.jpg


import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
from pprint import pprint


def scrape_page(soup, df, cols):
    for title in soup.find_all('div', class_='list-rst__rst-name'):
        #Erwerb des Geschäftsnamens
        name = title.find('a').text.strip()
        #Laden-URL abrufen
        shop_url = title.find('a').get('href')
        #Holen Sie sich Genre
        genre = title.find('span', class_='list-rst__area-genre cpy-area-genre').text
        genre = genre.replace('/', '').replace(' ', '').replace('、', ',')

        print('「' + name + 'Wird erworben ...')

        #Kratzen Sie die Seite für jeden Shop von der erhaltenen URL und erhalten Sie detaillierte Informationen
        res_shop = requests.get(shop_url)
        soup_shop = BeautifulSoup(res_shop.content, 'html.parser')
        time.sleep(0.1)

        #Präfekturen,Flächenerwerb
        prefecture = shop_url.split('/')[3]
        area = shop_url.split('/')[4]

        #Holen Sie sich eine Adresse
        address = soup_shop.find('p', class_='rstinfo-table__address').text.strip()

        #Erhalten Sie Mundpropaganda--Da ein Fehler auftritt, steuern Sie ihn mit einer try-Anweisung
        try:
            rate = float(soup_shop.find('span', class_='rdheader-rating__score-val-dtl').text.strip())
        except ValueError:
            rate = '-'
        #Holen Sie sich das Mindestbudget
        budget = soup_shop.find('em', class_='gly-b-dinner').text.strip()
        budget = budget.split('~')[0].replace('¥', '').replace(',', '')
        budget = int(budget)

        #Telefonnummer abrufen
        phone_num = soup_shop.find('p', class_='rstinfo-table__tel-num-wrap').text.strip()

        #Erfassung von Rauchinformationen
        smoke = soup_shop.find('p', class_='p-input-form__line').text.strip()

        #Erstellen Sie für jeden Shop eine leere Liste und hängen Sie sie an
        shop_datas = []
        shop_datas.append(name)
        shop_datas.append(genre)
        shop_datas.append(rate)
        shop_datas.append(budget)
        shop_datas.append(phone_num)
        shop_datas.append(smoke)
        shop_datas.append(address)
        shop_datas.append(prefecture)
        shop_datas.append(area)
        shop_datas.append(shop_url)

        #Generieren Sie einen Datenrahmen aus einer Liste und führen Sie ihn zusammen
        df_shop = pd.DataFrame([shop_datas], columns=cols, index=None)
        df = pd.concat([df, df_shop], sort=False)

    return df


def job():
    url = 'https://tabelog.com/go-to-eat/list/?page='
    page_cnt = 1
    cols = ['name', 'genre', 'rate', 'budget', 'tel', 'smoke', 'address', 'prefectures', 'area', 'url']
    df = pd.DataFrame(columns=cols, index=None)
    url = url + str(page_cnt)
    res = requests.get(url)
    soup = BeautifulSoup(res.content, 'html.parser')

    df = scrape_page(soup, df, cols)

    pprint(df.columns.values)
    pprint(df.head().values)


job()

Ausgabe

Informationen zu "Holzkohle-Grillfleisch Hiyori" erhalten ...
Informationen zu "Fleisch vom Holzkohlegrill / koreanisches Essen KollaBo Ebisu store" erhalten ...
Informationen zu "Miraku" erhalten ...
Informationen zu "Wine Bar. Dipunto Shibuya Shinnan Store" erhalten ...
Informationen zu "Kobe Beef Steak Kochen Yuzuki Hana Holzkohlegrill" erhalten ...
Informationen über "Italienisches Alberta KARASUMA von Fisch und Gemüse" erhalten ...
Informationen zu "Ningyocho Wine Bar" erhalten ...
Informationen zu "Basashi und Motsu Nabe Izakaya Kyushu Komachi Privatzimmer All-you-can-drink Kanayama 2-chome" erhalten ...
Informationen zu "Adult Japanese Sake Bar Irori" erhalten ...
Informationen zu "Hidden Bunch Machida" erhalten ...
Informationen zu "Aloha Table Yokohama Bay Quarter" erhalten ...
Informationen zu "Beer Garden Terrace Iidabashi" erhalten ...
Informationen zur "Takkanmari University" erhalten ...
Informationen zu "Private Room Steak & Italian Dining VT Ebisu" erhalten ...
Informationen zu "Yamakoya Sakaba Kemono" erhalten ...
Informationen zu "Genkatsugu" erhalten ...
Informationen zum "Kyomachi Koi Shigure Shinjuku Hauptgebäude" erhalten ...
Informationen zu "GINTO Ikebukuro store" erhalten ...
Informationen zu "Satsuma Jidori und Privatraum Izakaya Straw Fire Shinjuku" erhalten ...
"Fleischgroßhändler 25-Informationen zu "89" erhalten ...

array(['name', 'genre', 'rate', 'budget', 'tel', 'smoke', 'address',
       'prefectures', 'area', 'url'], dtype=object)
array([['Gegrilltes Holzkohlefleisch\u3000 Hiyori', 'Gegrilltes Fleisch,Taverne,Steak', 3.2, 4000, '050-5869-1319',
        'Alle Sitze können geraucht werden', '1 Nakayama Tedori, Chuo-ku, Stadt Kobe, Präfektur Hyogo-7-5 S Gebäude 2F', 'hyogo', 'A2801',
        'https://tabelog.com/hyogo/A2801/A280101/28032248/'],
       ['Fleisch vom Holzkohlegrill / koreanisches Essen KollaBo Ebisu Store', 'Gegrilltes Fleisch,koreanische Küche,Taverne', 3.09, 3000,
        '050-5571-4836', 'Alle Plätze sind Nichtraucherplätze', '1 Ebisu Nishi, Shibuya-ku, Tokio-14-1 Sonnenaufgang Gebäude\u30002F',
        'tokyo', 'A1303',
        'https://tabelog.com/tokyo/A1303/A130302/13178659/'],
       ['Miraku', 'Taverne,Meeresfrüchte und Meeresfrüchte,Schüssel Reis mit Sashimi belegt', 3.59, 3000, '050-5595-5384', 'Rauch trennen',
        '1 Kyomachi, Ogura Kita-ku, Stadt Kitakyushu, Präfektur Fukuoka-6-28', 'fukuoka', 'A4004',
        'https://tabelog.com/fukuoka/A4004/A400401/40001071/'],
       ['Weinbar. Dipunt Shibuya Shinnan speichern', 'Bar Bar,Taverne,Italienisch', 3.08, 2000,
        '050-5589-7383', 'Rauch trennen', '1 Shinnan, Shibuya-ku, Tokio-20-17 B1F', 'tokyo', 'A1303',
        'https://tabelog.com/tokyo/A1303/A130301/13186934/'],
       ['Kobe-Rindersteak, das Yuzuki Hana-Holzkohlegrill kocht', 'Steak,Kochen und kleine Gerichte,Gegrilltes Fleisch', 3.1, 10000,
        '050-5594-6576', 'Alle Plätze sind Nichtraucherplätze', '4 Kano-cho, Chuo-ku, Kobe-shi, Hyogo-8-19 Parfumgebäude 2F',
        'hyogo', 'A2801',
        'https://tabelog.com/hyogo/A2801/A280101/28050226/']],
      dtype=object)

Ich konnte die Informationen auf einer Seite erfolgreich abrufen. Wenn Sie danach die Seite des Skripts wie oben beschrieben hochzählen und sie für jede Präfektur schleifen, können Sie alle Informationen abrufen (Schweiß, der viel Zeit in Anspruch genommen hat).

Zuordnen

Ich habe Folium wie im Beispiel verwendet, kann aber nur dann eine Karte erstellen, wenn ich zusätzlich zur Adresse den Breiten- und Längengrad eingebe. Ich habe auf verschiedene Weise gesucht, aber mit dieser Site ist es einfach, von der Adresse zum Längen- und Breitengrad zu wechseln. Ich habe es benutzt, weil es so schien, als könnte ich es bekommen. Wenn Sie eine CSV-Datei mit der Adresse hochladen, können Sie die Datei mit dem der Spalte hinzugefügten Breiten- und Längengrad herunterladen. Speichern Sie es als tabelog_geo.csv und überprüfen Sie den Inhalt der Daten.


df = pd.read_csv('tabelog_geo.csv', encoding='shift_jis')
print('Die Anzahl der Daten:{}'.format(len(df)))
print('-------column---------')
pprint(df.columns.values)
print('-------head values----')
pprint(df.head().values)

Ausgabe

Die Anzahl der Daten:15020
-------column---------
array(['name', 'genre', 'rate', 'budget', 'tel', 'smoke', 'address',
       'url', 'prefectures', 'area', 'LocName', 'fX', 'fY', 'iConf',
       'iLvl'], dtype=object)
-------head values----
array([['Pferdefleisch Bar Bounce Madamachi Mita Store', 'Bar Bar,Taverne,Italienisch', 3.51, 3000, '050-5869-1861',
        'Alle Plätze sind Nichtraucherplätze', '5 Shiba, Minato-ku, Tokio-22-5 Harada-Gebäude 1F',
        'https://tabelog.com/tokyo/A1314/A131402/13143781/', 'tokyo',
        'A1314', 'Tokio/Minato-ku/Shiba/5-chome/Nr. 22', 139.74643999999998,
        35.648109999999996, 5.0, 7.0],
       ['Dorado', 'Bistro,Französisch,westliches Essen', 3.64, 5000, '050-5596-1243', 'Alle Plätze sind Nichtraucherplätze',
        '3 Sakae, Naka-ku, Stadt Nagoya, Präfektur Aichi-10-14 Pivot Lion Gebäude 2F',
        'https://tabelog.com/aichi/A2301/A230102/23029870/', 'aichi',
        'A2301', 'Präfektur Aichi/Nagoya Stadt/Naka-ku/Sannomaru/4-chome', 136.90649, 35.18425, 5.0, 6.0],
       ['Taverne Ryu no Su', 'Taverne,Meeresfrüchte und Meeresfrüchte,Gyoza', 3.16, 3000, '050-5456-3379',
        'Alle Plätze sind Nichtraucherplätze', '2 Yukimachi, Chitose-shi, Hokkaido-5-1',
        'https://tabelog.com/hokkaido/A0107/A010701/1024501/',
        'hokkaido', 'A0107', 'Hokkaido/Chitose City/Yukimachi/2-chome/Adresse 5', 141.64700000000002,
        42.822959999999995, 5.0, 7.0],
       ['Kushikatsu Dengana Yokohama Nanko', 'Taverne,Gebratene Spieße / Spieße,Hormon', 3.01, 0, '050-5597-9448',
        '-', '2 Minamiyuki, Nishi-ku, Yokohama-shi, Kanagawa-8-20SFBuilding2F',
        'https://tabelog.com/kanagawa/A1401/A140101/14079956/',
        'kanagawa', 'A1401', 'Präfektur Kanagawa/Nakagun/Ninomiya Stadt/Ninomiya', 139.25673999999998,
        35.30523, 5.0, 5.0],
       ['Fleisch vom Holzkohlegrill / koreanisches Essen Kolla Bo Shimbashi Laden', 'Taverne,Gegrilltes Fleisch,koreanische Küche', 3.06, 3000,
        '050-5592-3837', 'Rauch trennen', '2 Shimbashi, Minato-ku, Tokio-8-17 Sanken-Gebäude 1F',
        'https://tabelog.com/tokyo/A1301/A130103/13197832/', 'tokyo',
        'A1301', 'Tokio/Minato-ku/Shimbashi/2-chome/Nr. 8', 139.7563, 35.66747, 5.0, 7.0]],
      dtype=object)

O-chan und die Spalten fX, fY enthalten Breiten- und Längengradinformationen.

Datenplot

Ich habe mich gefragt, wie die Lebensmittelprotokolle verteilt sind, also werde ich sie mit Seaborn zeichnen. Ein Histogramm und ein Geigenplot.

#Histogramm erstellen
def plot_hist(df):
    #Weil einige Preise nicht erhalten werden können und als 0 registriert sind
    df = df[df['rate'] != 0]
    sns.set()
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.distplot(
        df['rate'], bins=10, color='blue', label='rate',
        kde=True)
    ax.set_title('histogram --tabelog rate')
    plt.show()

#Erzeugung eines Geigenplots
def plot_violin(df):
    df = df[df['rate'] != 0]
    sns.set()
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.violinplot(x=df['rate'].values, color='lightgreen')
    ax.set_title('violin_plot --tabelog rate')
    plt.show()

histo_tabelog.png

violin_tabelog.png

Ich habe noch nie eine Geigenhandlung zum ersten Mal benutzt, aber ich bin überrascht, dass sie ungewollt obszön wird. Abgesehen davon kann gelesen werden, dass Geschäfte mit einer Bewertung von etwa 3,4 oder höher insgesamt hoch bewertet sind.

Kartierung mit Folium

Wenn Sie alle Informationen zuordnen, handelt es sich um eine große Zahl. Daher möchte ich die Informationen im Voraus auf der Karte festhalten. Dieses Mal werden wir die Daten eingrenzen, indem wir "Italien" in das Genre aufnehmen, das maximale Budget beträgt "10.000 Yen", die Essensprotokollrate beträgt "3,2 oder mehr" und die Präfektur ist "Tokio". In der vorherigen Darstellung scheint eine Rate von 3,4 oder höher gut zu sein. Lassen Sie sie daher bei Geschäften mit einer Rate von 3,4 oder höher grün hervorstechen.

import folium
import pandas as pd


def param_input(df):
    #Einstellung jedes Parameters-Unbestimmt''
    param_genre = 'Italien'  #str Eingabe
    param_budget = 10000  #int Eingabe maximales Budget
    param_rate = 3.2  #Float-Eingang niedrigste Rate
    param_prefecture = 'tokyo'  #str Alphabetische Eingabe in halber Breite
    param_address = ''  #str Eingabe

    #Eingrenzen df nach param
    if param_genre != '':
        df = df[df['genre'].str.contains(param_genre)]
    if param_budget != '':
        df = df[df['budget'] <= param_budget]
    if param_rate != '':
        df = df[df['rate'] >= param_rate]
    if param_prefecture != '':
        df = df[df['prefectures'] == param_prefecture]
    if param_address != '':
        df = df[df['address'].str.contains(param_address)]

    return df


def make_folium_map(df):
    #Generieren Sie eine Karte mit dem allerersten Datensatz als Ausgangspunkt
    start_loc = df[['fY', 'fX']].values[0]
    m = folium.Map(location=start_loc, tiles='Stamen Terrain', zoom_start=12)

    for data in df[['fY', 'fX', 'name', 'rate', 'budget', 'smoke']].values:
        lat = data[0]
        lon = data[1]
        name = data[2]
        rate = data[3]
        budget = data[4]
        smoke = data[5]

        #Ping-Zeichen generieren
        ping_text = '{name}<br>{rate}<br>{budget}<br>{smoke}' \
            .format(name=name,
                    rate='Auswertung:' + str(rate),
                    budget=str(budget) + 'Yen ~',
                    smoke=smoke)

        #Symbol je nach Rate_Farbe einstellen
        # 3.4 oder mehr werden grün angezeigt
        if rate > 3.4:
            icon_color = 'green'
        else:
            icon_color = 'blue'

        #Setzen Sie einen Stift auf die Karte
        folium.Marker([lat, lon],
                      tooltip=ping_text,
                      icon=folium.Icon(color=icon_color)).add_to(m)
        m.save('tabelog_map.html')

df = pd.read_csv('tabelog_geo.csv', encoding='shift_jis')
df = param_input(df)
make_folium_map(df)

Ergebnis

tabelog.jpg

Wenn Sie zoomen und den Cursor bewegen, werden die Geschäftsinformationen angezeigt.

tabelog_zoom.jpg

Ich konnte erfolgreich mit der HTML-Datei zuordnen. Es wäre sogar noch besser, wenn es mit Heroku im Internet hochgeladen werden könnte, aber da es derzeit versucht wird, wird es als schneller Screenshot veröffentlicht.

Es kann interessant sein, neue Dinge zu entdecken, indem man Zufallszahlen generiert und zufällig entscheidet, in welches Geschäft man gehen soll. Schließlich gehe ich eher in die Läden, in die ich immer gehe.

Bonus

[Diese Site](https://hikiniku11029.hatenablog.com/entry/2019/06/18/folium%E3%81%A7%E3%83%92%E3%83%BC%E3%83%88% E3% 83% 9E% E3% 83% 83% E3% 83% 97% E3% 81% AE% E4% BD% 9C% E3% 82% 8A% E6% 96% B9% E3% 82% 92% E3% Ich habe eine Heatmap mit Bezug auf 81% 8A% E3% 81% BC% E3% 81% 88% E3% 81% 9F erstellt. Der Ort, an dem es ein Geschäft mit hohen Raten gibt, scheint stark.

heat.jpg

heat_wide.jpg

Recommended Posts

Ordnen Sie die für die GoToEat-Kampagne bestimmten Geschäfte zu und genießen Sie sie
Scraping Shizuokas offizielle GoToEat-Website und Auflistung der Geschäfte, die für die Izu-Kampagne bestimmt sind
Vergleichen Sie die Geschwindigkeit von Python Append und Map