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
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.
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).
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.
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()
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.
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
Wenn Sie zoomen und den Cursor bewegen, werden die Geschäftsinformationen angezeigt.
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.
[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.