Comparaison de l'assortiment de plats de trois restaurants à Saint-Pétersbourg

Je n'ai jamais eu Ă  analyser les donnĂ©es d'Internet auparavant. Habituellement, toutes les donnĂ©es pour le travail (analyste de donnĂ©es) proviennent des dĂ©chargements de l'entreprise Ă  l'aide d'une interface interne simple, ou sont formĂ©es par des requĂȘtes SQL vers des tables directement Ă  partir du stockage, si vous avez besoin de quelque chose de plus complexe que de «regarder les revenus pour le prĂ©cĂ©dent mois". 





Par consĂ©quent, je voulais maĂźtriser un outil simple pour analyser les pages html afin de pouvoir collecter des donnĂ©es sur Internet en utilisant du code dans un IDE pratique sans faire appel Ă  des outils tiers. 





Les sites de collecte de donnĂ©es ont Ă©tĂ© sĂ©lectionnĂ©s sur le principe «il n'y a pas de parser blocker» et «quelque chose d'intĂ©ressant peut sortir de l'analyse de ces donnĂ©es». Par consĂ©quent, le choix s'est portĂ© sur un assortiment de plats pour la livraison de trois restaurants Ă  Saint-PĂ©tersbourg - «Tokyo City», «Eurasia» et «2 Berega». Ils ont Ă  peu prĂšs le mĂȘme objectif culinaire et un assortiment similaire, il y a donc clairement quelque chose Ă  comparer. 





Je partagerai l'analyseur lui-mĂȘme pour l'un des restaurants.





import requests
from bs4 import BeautifulSoup
import pandas as pd
import datetime

print("   : " + str(datetime.datetime.now()))
#     
urllist = ['https://www.tokyo-city.ru/spisok-product/goryachie-blyuda1.html',
           'https://www.tokyo-city.ru/spisok-product/sushi.html',
           'https://www.tokyo-city.ru/spisok-product/rolly.html',
           'https://www.tokyo-city.ru/spisok-product/nabory.html',
           'https://www.tokyo-city.ru/spisok-product/new_lunches.html',
           'https://www.tokyo-city.ru/spisok-product/pitctca.html',
           'https://www.tokyo-city.ru/spisok-product/salaty.html',
           'https://www.tokyo-city.ru/spisok-product/-supy-.html',
           'https://www.tokyo-city.ru/spisok-product/goryachie-zakuski1.html',
           'https://www.tokyo-city.ru/spisok-product/wok.html',
           'https://www.tokyo-city.ru/spisok-product/pasta.html',
           'https://www.tokyo-city.ru/spisok-product/gamburgery-i-shaverma.html',
           'https://www.tokyo-city.ru/spisok-product/Tokio-FIT.html',
           'https://www.tokyo-city.ru/spisok-product/deserty.html',
           'https://www.tokyo-city.ru/spisok-product/childrensmenu.html',
           'https://www.tokyo-city.ru/spisok-product/napitki1.html',
           'https://www.tokyo-city.ru/new/',
           'https://www.tokyo-city.ru/spisok-product/postnoe-menyu.html',
           'https://www.tokyo-city.ru/hit/',
           'https://www.tokyo-city.ru/vegetarian/',
           'https://www.tokyo-city.ru/hot/',
           'https://www.tokyo-city.ru/offers/',
           'https://www.tokyo-city.ru/spisok-product/sauces.html',
           'https://www.tokyo-city.ru/spisok-product/Pirogi-torty.html']
#      
names_all = []
descriptions_all = []
prices_all = []
categories_all = []
url_all = []
weight_all = []
nutr_all = []
# 
for url in urllist:
    response = requests.get(url).text
    soup = BeautifulSoup(response, features="html.parser")
    items = soup.find_all('a', class_='item__name')
    itemsURL = []
    n = 0
    for n, i in enumerate(items, start=n):
        itemnotfullURL = i.get('href')
        itemURL = 'https://www.tokyo-city.ru' + itemnotfullURL
        itemsURL.extend({itemURL})
        m = 0
        namesList = []
        descriptionsList = []
        pricesList = []
        weightList = []
        nutrList = []
        itemResponse = requests.get(itemURL).text
        itemsSoup = BeautifulSoup(itemResponse, features="html.parser")
        itemsInfo = itemsSoup.find_all('div', class_='item__full-info')
        for m, u in enumerate(itemsInfo, start=m):
            if (u.find('h1', class_='item__name') == None):
                itemName = 'No data'
            else:
                itemName = u.find('h1', class_='item__name').text.strip()
            if (u.find('p', class_='item__desc') == None):
                itemDescription = 'No data'
            else:
                itemDescription = u.find('p', class_='item__desc').text.strip()
            if (u.find('span', class_='item__price-value') == None):
                itemPrice = '0'
            else:
                itemPrice = u.find('span', class_='item__price-value').text
            if (u.find('div', class_='nutr-value') == None):
                itemNutr = 'No data'
            else:
                itemNutr = u.find('div', class_='nutr-value').text.strip()
            if (u.find('div', class_='item__weight') == None):
                itemWeight = '0'
            else:
                itemWeight = u.find('div', class_='item__weight').text.strip()
            namesList.extend({itemName})
            descriptionsList.extend({itemDescription})
            pricesList.extend({itemPrice})
            weightList.extend({itemWeight})
            nutrList.extend({itemNutr})
        df = pd.DataFrame((
            {'Name': namesList,
             'Description': descriptionsList,
             'Price': pricesList,
             'Weight': weightList,
             'NutrInfo': nutrList
             }))
        names_all.extend(df['Name'])
        descriptions_all.extend(df['Description'])
        prices_all.extend(df['Price'])
        weight_all.extend(df['Weight'])
        nutr_all.extend(df['NutrInfo'])
        df['Category'] = soup.find('div', class_='title__container').text.strip()
        categories_all.extend(df['Category'])
result = pd.DataFrame((
    {'Name': names_all,
     'Description': descriptions_all,
     'Price': prices_all,
     'Category': categories_all,
     'NutrInfo': nutr_all,
     'Weight': weight_all,
     }))
print("   : " + str(datetime.datetime.now()))
      
      



- / . , . , , , - - .





- .









, , , , , , . 





:





. , . , , , , . 





  • City





“ City” 19 5 , , (, ). - 351.









“” - 13 , 301 . , “ City” , 40% , , , “”. 





  • 2





- 241 15 .





, , , . 





№1: ?

, “” .





, , , . , “”, “ ”, “”, “”, “” “” + .





:





, “2 ” - №1 . , “” (“ City” - 20, “” - 17 “2 ” - 51).





  - , “” .





№2: ?

, - “”, “” “ ”. . , , “ ”, . 





100 , :





“2 ” , “ ”. , “ + ” . “ ” “ City” “”. 





“ City” . “2 ” 2 . “” . 100 “” 30% ( , ), “ City” . 





, :





“” . “” 30% . 





“2 ” , . , “ ” , , 2 + ( ). .





“ City” .





№3: ?

, , . , . 





“ City” 205 100 , . , . “2 ” 35% , . , , , . 





: ? 

, , , , .





MalgrĂ© la teneur en calories la plus Ă©levĂ©e pour 100 grammes et une grande quantitĂ© de restauration rapide, «2 Shores» propose un menu assez Ă©quilibrĂ©, tandis que le mĂȘme «Tokyo City» a un biais clair vers les glucides. 





BZHU "Eurasia" est en quelque sorte trop uniforme, pratiquement sans Ă©missions, donc cela suscite des soupçons. 





En gĂ©nĂ©ral, il y a des doutes sur l'exactitude des conclusions que j'ai tirĂ©es spĂ©cifiquement dans cette question - peut-ĂȘtre, pour la bonne rĂ©ponse Ă  la question, ces indicateurs doivent-ils ĂȘtre Ă©valuĂ©s diffĂ©remment. 






Voici une si petite, mais curieuse, à mon avis, la recherche est venue de la pensée aléatoire «d'analyser quelque chose».








All Articles