[Python] Ich möchte ein Gourmet sein. [Datengesteuerter Ansatz] Auswahl eines Geschäfts für die Jahresend- und Neujahrsfeiertage

1. Motivation

** "Verwenden Sie Scraping, um ein köstliches und leistungsstarkes Restaurant zu finden, unabhängig von der Punktzahl des Essensprotokolls! 』**

Als Index, der die Stimmen der Benutzer widerspiegelt, steigt die Punktzahl, wenn höhere Bewertungen von Benutzern gesammelt werden, die Einfluss haben. Wenn beispielsweise der Grad des Einflusses gleich ist, erhält ein Geschäft mit 100 5-Punkte-Bewertungen eine höhere Punktzahl als ein Geschäft mit nur 2 5-Punkte-Bewertungen.

2. Implementierter Code

Code zum Abrufen von Informationen aus dem Essprotokoll in Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup
import math
import time

root_url = 'https://tabelog.com/'
res = requests.get(root_url)
soup = BeautifulSoup(res.content, 'html.parser')
a = soup.find_all('a', class_='rsttop-area-search__target js-area-swicher-target')

area_url = {}
for area in a:
    area_dict = {}
    splitted = area.get('data-swicher-area-list').split('"')
    for i in range(int((len(splitted)-1)/8)):
        area_dict[splitted[i*8+3]] = splitted[i*8+7]
    area_url[area.get('data-swicher-city').split('"')[3]] = area_dict

visit_areas = ['Shibuya / Ebisu / Daikanyama']
url_dict = {}
for visit_area in visit_areas:
    url = area_url['Tokio'][visit_area]
    time.sleep(1)
    res = requests.get(root_url + url[1:])
    soup = BeautifulSoup(res.content, 'html.parser')
    a = soup.find_all('a', class_='c-link-arrow')
    for area in a:
        href = area['href']
        if href[-21:-8]!=url:
            continue
        else:
            url_dict[area.text] = href

max_page = 20
restaurant_data = []
for area, url in url_dict.items():
    time.sleep(1)
    res_area = requests.get(url)
    soup_area = BeautifulSoup(res_area.content, 'html.parser')
    rc_count = int(soup_area.find_all('span', class_='list-condition__count')[0].text)
    print('There are ' + str(rc_count) + ' restaurants in ' + area)
    for i in range(1,min(math.ceil(rc_count/20)+1,max_page+1,61)):
        print('Processing...  ' + str(i) + '/' + str(min(math.ceil(rc_count/20)+1,max_page+1,61)-1))
        url_rc = url + 'rstLst/RC/' + str(i) + '/?Srt=D&SrtT=nod'
        res_rc = requests.get(url_rc)
        soup_rc = BeautifulSoup(res_rc.content, 'html.parser')
        for rc_div in soup_rc.find_all('div', class_='list-rst__wrap js-open-new-window'):
            rc_name = rc_div.find('a', class_='list-rst__rst-name-target cpy-rst-name').text
            rc_url = rc_div.find('a', class_='list-rst__rst-name-target cpy-rst-name')['href']
            rc_score = rc_div.find('span', class_='c-rating__val c-rating__val--strong list-rst__rating-val')
            if rc_score is None:
                rc_score = -1.
            else:
                rc_score = float(rc_score.text)
            rc_review_num = rc_div.find('em', class_='list-rst__rvw-count-num cpy-review-count').text
            if rc_review_num != ' - ':
                page = 1
                score = []
                while True:
                    rc_url_pg = rc_url + 'dtlrvwlst/COND-2/smp0/?smp=0&lc=2&rvw_part=all&PG=' + str(page)
                    time.sleep(1)
                    res_pg = requests.get(rc_url_pg)
                    soup_pg = BeautifulSoup(res_pg.content, 'html.parser')
                    if 'Ich kann die gesuchte Seite nicht finden' in soup_pg.find('title').text:
                        break
                    try:
                        station = soup_pg.find_all('dl', class_='rdheader-subinfo__item')[0].find('span', class_='linktree__parent-target-text').text
                    except:
                        try:
                            station = soup_pg.find_all('dl', class_='rdheader-subinfo__item')[0].find('dd', class_='rdheader-subinfo__item-text').text.replace('\n','').replace(' ','')
                        except:
                            station = ''
                    genre = '/'.join([genre_.text for genre_ in soup_pg.find_all('dl', class_='rdheader-subinfo__item')[1].find_all('span', class_='linktree__parent-target-text')])
                    price = soup_pg.find_all('dl', class_='rdheader-subinfo__item')[2].find('p', class_='rdheader-budget__icon rdheader-budget__icon--dinner').find('a', class_='rdheader-budget__price-target').text
                    score = score + [score_.next_sibling.next_sibling.text for score_ in soup_pg.find_all('span', class_='c-rating__time c-rating__time--dinner')]
                    page += 1
                    if page == math.ceil(int(rc_review_num)/100)+1:
                        break
                restaurant_data.append([area, rc_count, rc_name, rc_url, rc_score, rc_review_num, station, genre, price, score])

Code-Erklärungen und Details finden Sie auch unter Scraping and Eating Log - Ich möchte ein gutes Restaurant finden! ~ (Arbeit), schauen Sie also bitte vorbei, wenn Sie interessiert sind.

3. Was ist das Ergebnis, an dem Sie interessiert sind? ??

Zeichnen und visualisieren Sie Daten

Das Ergebnis ist wie folgt! Die 400 besten Restaurants in Shibuya, Ebisu und Daikanyama werden in der Reihenfolge ihrer Neueröffnung ausgewählt. save.png

Implikation

Was Sie aus diesem Streudiagramm lesen können, ist ...

4. Tiefere Betrachtung

Von hier an werde ich mit meiner Neugier etwas mehr darüber nachdenken.

Punkteverteilung

Als ich mir das Streudiagramm früher ansah, war ich neugierig, dass die Verteilung der Essensprotokollwerte verzerrt war und dass sich die Restaurants auf ein bestimmtes Ergebnis konzentrierten. Also, wenn Sie sich die Verteilung ansehen save.png Ich mache mir auch Sorgen, dass sich Restaurants auf eine bestimmte Punktzahl konzentrieren, aber ich mache mir auch Sorgen, dass es extrem wenige Restaurants mit einer bestimmten Punktzahl gibt.

Ich habe die Beziehung mit der Anzahl der Bewertungen untersucht, aber ich konnte kein Ergebnis erhalten, das dies erklären könnte ... Möglicherweise ist der Schlüssel die Daten, die dieses Mal nicht erfasst wurden, wie z. B. die Anzahl der Tage seit dem Öffnen. Gerüchten zufolge gibt es eine Theorie, dass der jährliche Mitgliedsbeitrag, den das Restaurant an das Lebensmittelprotokoll zahlt, die Punktzahl des Lebensmittelprotokolls begrenzt, was sich ebenfalls auswirken kann. Abhängig von der Denkweise ist die Punktzahl für das Essensprotokoll aufgrund der Obergrenze der Punktzahl niedrig, aber die Mundpropaganda ist ein Faktor, der zu hohen Restaurants führt. Wenn Sie den diesmal eingeführten Ansatz verwenden, ** ist er nicht beliebter als erforderlich. Sie finden ein Geschäft **.

5. Zusammenfassung

Recommended Posts

[Python] Ich möchte ein Gourmet sein. [Datengesteuerter Ansatz] Auswahl eines Geschäfts für die Jahresend- und Neujahrsfeiertage
Ich möchte eine schöne Python-Entwicklungsumgebung für meinen neuen Mac erstellen
Ich möchte Daten mit Python analysieren können (Teil 3)
Ich möchte Daten mit Python analysieren können (Teil 4)
Ich möchte Daten mit Python analysieren können (Teil 2)
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
Ich möchte die Natur von Python und Pip kennenlernen
Ich möchte mit Python nur das Gesicht aus einem Personenbild ausschneiden und speichern ~ Gesichtserkennung und Zuschneiden mit face_recognition ~
Ich möchte vorerst eine Docker-Datei erstellen.
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Ich möchte die Ausführungszeit aufzeichnen und ein Protokoll führen.
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Ich möchte eine Python-Umgebung erstellen
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Ich möchte gleichzeitig einen Musik-Player erstellen und Musik ablegen
Ich möchte ein Programm ausführen und verteilen, das die Größe von Bildern in Python3 + Pyinstaller ändert
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich suchte nach den Fähigkeiten, die erforderlich sind, um Webingenieur bei Python zu werden
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Ich möchte mit Python ein Fenster erstellen
Ich möchte ein Spiel mit Python machen
Ich möchte mit Python in eine Datei schreiben
Ich möchte den Fortschritt in Python anzeigen!
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich möchte nur das 95% -Konfidenzintervall des Unterschieds im Bevölkerungsverhältnis in Python ermitteln
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
Ich habe ein Python-Diagramm mit öffentlichen Daten zur Anzahl der neuen Coronavirus (COVID-19) -positiven Patienten in Tokio + mit einem Link zur nationalen Version der Praxisdaten gezeichnet
Ich möchte Timeout einfach in Python implementieren
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte einem Pandas-Datenrahmen eine group_id geben
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich möchte R-Datensatz mit Python verwenden
Ich möchte einen Quantencomputer mit Python betreiben
Python - Lesen Sie Daten aus einer numerischen Datendatei, um die verteilte, gemeinsam verteilte Matrix, Eigenwerte und Eigenvektoren zu finden
Ich möchte den Schnittpunkt einer Bezier-Kurve und einer geraden Linie finden (Bezier-Clipping-Methode)
Ich möchte eine Karaoke-Klangquelle erstellen, indem ich Instrumente und Gesang mit Python trenne
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich möchte einen Sprachwechsler mit Python und SPTK in Bezug auf eine berühmte Site erstellen
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können