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».