Как реализовать поиск рецептов с сайта?

Рейтинг: -1Ответов: 1Опубликовано: 28.06.2023

Пытаюсь написать программу для подбора рецептов из имеющихся продуктов. По замыслу, есть сайт, с которого программа по введенным мною продуктам должна выдать рецепт. Однако, программа выводит "извините, подходящего рецепта не найдено" по всем рецептам (их тысячи), а мне нужно, чтобы программа скрытно проверила все рецепты и написала, что рецепт не найден или выдала готовый. Вот код:

    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