Как реализовать поиск рецептов с сайта?
Пытаюсь написать программу для подбора рецептов из имеющихся продуктов. По замыслу, есть сайт, с которого программа по введенным мною продуктам должна выдать рецепт. Однако, программа выводит "извините, подходящего рецепта не найдено" по всем рецептам (их тысячи), а мне нужно, чтобы программа скрытно проверила все рецепты и написала, что рецепт не найден или выдала готовый. Вот код:
rom bs4 import BeautifulSoup
available_ingredients = input("Введите список имеющихся продуктов: ").split(", ")
import requests
url = "https://www.iamcook.ru/"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
recipes = soup.find_all("div", {"class": "entry-content"})
def is_recipe_suitable(recipe_ingredients, available_ingredients):
for ingredient in recipe_ingredients:
if ingredient not in available_ingredients:
return False
return True
while True:
suitable_recipe = None
for recipe in recipes:
recipe_ingredients = recipe.find("ul").find_all("li")
recipe_ingredients = [ingredient.text for ingredient in recipe_ingredients]
if is_recipe_suitable(recipe_ingredients, available_ingredients):
suitable_recipe = recipe
break
if suitable_recipe:
print(suitable_recipe.text)
user_input = input("Хотите ли вы получить другой рецепт? (да/нет): ")
if user_input.lower() == "нет":
break
else:
print("Извините, подходящего рецепта не найдено.")
while True:suitable_recipe = None
recipe_found = False
while not recipe_found:
for recipe in recipes:
recipe_ingredients = recipe.find("ul").find_all("li")
recipe_ingredients = [ingredient.text for ingredient in recipe_ingredients]
if is_recipe_suitable(recipe_ingredients, available_ingredients):
suitable_recipe = recipe
recipe_found = True
break
if suitable_recipe:
# Выводим информацию о подходящем рецепте
print("Подходящий рецепт:")
print_recipe(suitable_recipe)
else:
print("Извините, подходящего рецепта не найдено.")
_input = input("Хотите ли вы продолжить работу? (да/нет): ")
if _input.lower() == "нет":
# Выход из программы
sys.exit()
Либо прошу подсказать, как реализовать в процентном соотношении. Т.е. у меня есть три вида продукта из четырех и программа мне выдаст, что рецепт подходит мне на 75 процентов.
П.С. Я новичок, и прошу не кидаться камнями. Очень надеюсь на дельный совет и подсказку.
Ответы (1 шт):
Будет легче воспользоваться встроенным в сайт поиском. Вот пример кода:
import requests
from bs4 import BeautifulSoup
import re
# Удаляем названия продуктов и лишьние пробелы
available_ingredients = [re.sub(r" \".+\"", "", ing.lower().strip())
for ing in input("Введите список имеющихся продуктов: ").split(',')]
available_ingredients_str = ""
# Поиск сайта не поддерживает поиск ингридиентов с двумя словами в названии
# Поэтому разделяем их на 2 ингридиента
for i in range(len(available_ingredients)):
if i != len(available_ingredients) - 1:
available_ingredients_str += ', '.join(
available_ingredients[i].split(' ')) + ', '
else:
available_ingredients_str += ', '.join(
available_ingredients[i].split(' '))
url = "https://www.iamcook.ru/advsearchingr"
data = {"recname": None,
"recingrinc": available_ingredients_str.encode('windows-1251'),
"recingrexcl": None,
"recsubsection": "0",
"recevent": "0",
"recmode": "0",
"rectools": "0",
"reccal": None,
"rectime": None,
"sorttype": "0"}
# Отправляем запрос
response = requests.post(url, data=data)
soup = BeautifulSoup(response.content, "html.parser")
recipes = soup.find_all("div", {"class": "info"}) # Ищем все рецепты
def check(recipe, ingredients):
count = 0
for ingredient in recipe.keys():
if recipe[ingredient] == 'по вкусу':
continue
if re.sub(r" \".+\"", "", ingredient) not in ingredients:
count += 1
return 1 - (count / len(recipe.keys()))
grabbed_recipes = []
for recipe in recipes:
recipe_ingredients = {}
# Ищем информацию о ингридиентах и порциях
for ingredients_mass in recipe.find('div', {"class": "ingrlayer"}).find_all('p'):
match = re.findall('(.+)[–-](.+)', ingredients_mass.text)
if len(match):
ingredients, mass = match[0]
else:
ingredients, mass = ingredients_mass.text, '?'
for ingredient in ingredients.split(', '):
recipe_ingredients[ingredient.lower().strip()] = mass
# Добавляем рецепт в список
grabbed_recipes.append([check(recipe_ingredients, available_ingredients),
recipe.find('div', {"class": "header"}).text,
"https://www.iamcook.ru" + recipe.find('a', href=True)['href'],
recipe_ingredients])
# Сортируем по уоличеству подходящих ингредиентов
grabbed_recipes.sort(key=lambda x:x[0], reverse=True)
for recipe in grabbed_recipes:
if recipe[0] > 0.40: # Выводим только если рецепт подходит на более чем 40%
print(f"Этот рецепт подходит вам на {round(recipe[0] * 100)}%")
print(recipe[1])
for ing in recipe[3].keys():
print(ing, '-', recipe[3][ing])
print(recipe[2])
print()
Пример ввода:
Цветная капуста, Сметана, Яйцо куриное, Сыр, Масло сливочное
Вывод:
Этот рецепт подходит вам на 100%
Цветная капуста со сметаной в духовке
цветная капуста - 300 г
сметана - 250 г
яйцо куриное - 1 шт.
соль - по вкусу
перец - по вкусу
мускатный орех - по вкусу
сыр "моцарелла" - 100 г
масло сливочное - 10 г
https://www.iamcook.ru/showrecipe/13865
Этот рецепт подходит вам на 55%
Киш с цветной капустой
мука пшеничная - 200 г
масло сливочное - 100 г
сметана - 2 ст.л.
соль - по вкусу
цветная капуста - 200 г
яйцо куриное - 2 шт.
молоко 3,2% - 150 мл
сыр твердый - 70 г
горчица не острая - 1 ч.л.
петрушка - 10 г
перец черный молотый - по вкусу
https://www.iamcook.ru/showrecipe/27227