** "Utilisez le grattage pour trouver un restaurant délicieux et puissant quel que soit le score du journal de consommation! 』**
En tant qu'indice reflétant la voix des utilisateurs, le système est tel que le score augmente à mesure que des évaluations plus élevées sont collectées auprès des utilisateurs qui ont une influence. Par exemple, si le degré d'influence est le même, un magasin avec 100 évaluations à 5 points obtiendra un score plus élevé qu'un magasin avec seulement 2 évaluations à 5 points.
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['Tokyo'][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 'Je ne trouve pas la page que je recherche' 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])
De plus, pour des explications sur le code et des détails, consultez Journal de raclage et de consommation - Je veux trouver un bon restaurant! ~ (Travail), alors jetez un œil si vous êtes intéressé.
Le résultat est le suivant! Les 400 meilleurs restaurants de Shibuya, Ebisu et Daikanyama sont visés par ordre d'ouverture.
Ce que vous pouvez lire sur ce diagramme de dispersion est ...
A partir de là, je vais y réfléchir un peu plus, avec ma curiosité.
En regardant le diagramme de dispersion plus tôt, j'étais curieux de voir que la distribution des scores du journal des repas était déformée et que les restaurants étaient concentrés sur un score spécifique. Donc, si vous regardez la distribution Je suis également préoccupé par le fait que les restaurants sont concentrés sur un score spécifique, mais je suis également préoccupé par le fait qu'il y ait extrêmement peu de restaurants sur un score spécifique.
J'ai enquêté sur la relation avec le nombre d'avis, mais je n'ai pas pu obtenir de résultat qui pourrait expliquer cela ... Peut-être que la clé est les données non acquises cette fois, comme le nombre de jours depuis l'ouverture. Selon la rumeur, il existe une théorie selon laquelle la cotisation annuelle payée par le restaurant au journal alimentaire limite le score du journal alimentaire, ce qui peut également avoir un effet. Cependant, selon la façon de penser, le score du journal alimentaire est faible en raison de la fixation de la limite supérieure du score, mais le score de bouche-à-oreille est un facteur qui provoque des restaurants élevés. Vous pouvez trouver un magasin **.
Recommended Posts