** "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.
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.
Das Ergebnis ist wie folgt! Die 400 besten Restaurants in Shibuya, Ebisu und Daikanyama werden in der Reihenfolge ihrer Neueröffnung ausgewählt.
Was Sie aus diesem Streudiagramm lesen können, ist ...
Von hier an werde ich mit meiner Neugier etwas mehr darüber nachdenken.
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 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 **.
Recommended Posts