前两天和朋友聊天,说最近每次回家做饭都不知道要吃什么,好苦恼。
对于选择这种事情,不能因为这个浪费了人生啊,对吧。
基于对好友的“体贴”(我也是够无聊的),就搞一个随机生成菜单的脚本吧!
我们就让Python这个好朋友帮我们来选择一下——今天吃什么~
基本逻辑
1、自己选择想要吃的食材和菜的数量,初始化各种参数
2、随机在食材列表中选择指定数量的食材(帮你选择食材)
3、基于requests,使用食材关键词在下厨房网页端搜索菜谱网页源代码,返回菜谱列表
4、随机在菜谱列表中选择一个菜谱,然后输出菜的做法。
5、再根据需要增加关键词筛选和评分过滤机制,提高菜谱的质量。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# 今天吃什么 import requests import random import re def main(): hun = ['鸡肉', '牛肉', '排骨', '五花肉', '瘦肉', '鸡蛋', '鱼'] # 荤菜种类 su = ['青菜', '胡萝卜', '黄瓜', '豆芽', '土豆', '花菜'] # 素材种类 hunNum = '1' # 荤菜数量 suNum = '2' # 素菜数量 score = '8.0' # 定义评分低于指定分数的菜单不被选择 noNeed = ['早餐', '炸'] # 屏蔽关键词 keywordsHun = random.sample(hun, int(hunNum)) keywordsSu = random.sample(su, int(suNum)) keywords = keywordsHun + keywordsSu print('·· 您选择了{}荤{}素哦~'.format(hunNum, suNum)) print('-> 我帮您选择了: {}'.format(keywords)) menuList = [] for keyword in keywords: # 搜索下厨房:http://m.xiachufang.com/search/?keyword=x url = 'http://m.xiachufang.com/search/?keyword=' + keyword keywordSource = get_source(url) # 返回搜索结果源代码 # selectMenu = [url, name, menuScore] selectMenu = read_source(keywordSource, score, noNeed) # 返回下厨房对应食材的搜索首页的高于score分值的数据,并随机选择一条 # 查看详细做法 menuUrl = 'http://m.xiachufang.com' + selectMenu[0] menuSource = get_source(menuUrl) # 返回选择菜单步骤页面源代码 menuDict = get_menu_steps(menuSource, selectMenu[2]) # 获取原材料和步骤 menuList.append(menuDict) print_out(menuList) # 打印菜单 def get_source(url): r = requests.get(url) return r.text def read_source(source, score, noNeed): menuList =[] regMenuText = re.compile(r'<a href=\"(/recipe.*?)\" class=\"recipe-96-horizon\".*?<header class=\"name font18\">(.*?)</header>.*?<div class=\"stat flex-1\">评分 <span>(.*?)</span>', re.S) regMenuList = regMenuText.findall(source) for i in regMenuList: if float(i[2]) >= float(score): for j in noNeed: if j not in i: menuList.append(i) selectMenu = random.sample(menuList, 1)[0] return selectMenu def get_menu_steps(source, score): regTitle = re.findall(r'<h1 class=\"plain\">(.*?)</h1>', source)[0] regUrl = re.findall(r'<link rel=\"canonical\" href=\"(.*?)\">', source)[0] regPlain = re.compile(r'<span class=\"ingredient\">(.*?)</span>.*?<span class=\"weight\">(.*?)</span>', re.S) regPlainList = regPlain.findall(source) regSteps = re.compile(r'<aside class=\"sub-title\">(.*?)</aside>.*?<p class=\"word-wrap\">(.*?)</p>', re.S) regStepsList = regSteps.findall(source) menuDict = { "name": regTitle, "score": score, "url": regUrl, "plains": regPlainList, "steps": regStepsList } return menuDict def print_out(menuList): print('√ 今天的菜单是: {}\n'.format(list(x['name'] for x in menuList))) for menuDict in menuList: print('☆★' * 20) print('-' * 31 + 'Name' + '-' * 31) print('{} - {} - {}'.format(menuDict['name'], menuDict['score'], menuDict['url'])) print('-'*30 + 'Plains' + '-'*30) for x, y in menuDict['plains']: print('{} - {}'.format(x, y), end='\t') print('\n' + '-' * 31 + 'Steps' + '-' * 30) for x, y in menuDict['steps']: print('{} - {}'.format(x, y)) print('☆★'*20 + '\n'*2) if __name__ == '__main__': main() |
输出样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
·· 您选择了1荤2素哦~ -> 我帮您选择了: ['鱼', '花菜', '豆芽'] √ 今天的菜单是: ['红烧鱼', '小炒花菜', '黄豆芽炒粉条'] ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ -------------------------------Name------------------------------- 红烧鱼 - 8.0 - https://m.xiachufang.com/recipe/181441/ ------------------------------Plains------------------------------ 鱼 - 盐 - 油 - 生姜丝 - 豆瓣酱 - 葱花 - 香菜 - -------------------------------Steps------------------------------ 步骤 1 - 鱼处理完洗净后抹少许盐入味,下油锅前要保证鱼的表面没有水分,否则会粘锅,最终导致破相 步骤 2 - 锅里放油,可稍微多一些,等油至6成热时可下鱼开始煎 步骤 3 - 鱼放入锅后,先大火将鱼身全部煎得微黄,再转小火慢煎.先不要轻易动鱼,轻轻晃一下锅,如果晃得动说明可以翻面了,看,鱼皮漂亮吧,我为了使鱼更加入味,还在鱼背上划了花刀 步骤 4 - 等鱼的两面都煎好,可以将切好的生姜丝放入鱼的一边 步骤 5 - 再放入豆瓣酱小炒出红油 步骤 6 - 放入适量的水,将鱼焖熟 步骤 7 - 起锅前洒入葱花和香菜,似乎多了一些,不怕,反正我爱吃 ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ -------------------------------Name------------------------------- 小炒花菜 - 8.2 - https://m.xiachufang.com/recipe/46851/ ------------------------------Plains------------------------------ 去皮五花肉 - 适量 菜花 - 一个 洋葱 - 少许 青蒜 - 少许 胡萝卜 - 少许 葱姜 - 少许 料酒 - 少许 白胡椒粉 - 少许 生抽 - 一点 干豆豉 - 少许 郫县豆瓣酱 - 少许(或红油豆瓣酱) 甜面酱 - 少许 香油 - 一点 -------------------------------Steps------------------------------ 步骤 1 - 五花肉去皮洗净擦干,切薄片。用料酒、白胡椒粉、生抽和葱姜末腌一会儿 步骤 2 - 胡萝卜去皮切片,青蒜洗净切段儿(叶子和茎最好分开放),洋葱撕去内层的薄膜后洗净,切片 步骤 3 - 准备好葱花、姜末和豆豉 步骤 4 - 菜花掰成小朵,入沸水中快速焯烫下后捞出,用凉水冲净沥干 步骤 5 - 锅中倒少许油,倒入五花肉片炒至,边缘发黄,大约九成熟 步骤 6 - 重起锅,热锅凉油,小火爆香葱姜,倒入胡萝卜片略微翻炒一下 步骤 7 - 倒入五花肉片、青蒜(白色部分)和洋葱,翻炒一下后调入郫县豆瓣酱、甜面酱和生抽,翻炒一小会儿 步骤 8 - 最后再倒入焯好的菜花和青蒜的绿色叶子,快速炒匀 步骤 9 - 调入少许香油,炒匀即可。盐看情况再加,基本不用放了 ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ -------------------------------Name------------------------------- 黄豆芽炒粉条 - 8.0 - https://m.xiachufang.com/recipe/115002/ ------------------------------Plains------------------------------ 黄豆芽 - 红薯粉 - 蒜 - 葱 - 生抽 - 蚝油 - 盐 - 干辣椒 - -------------------------------Steps------------------------------ 步骤 1 - 粉条提前用凉水泡好备用 步骤 2 - 黄豆芽洗净,挑干净里面的黄豆皮,备用 步骤 3 - 蒜葱切片 步骤 4 - 热锅,放油,小火放入葱蒜辣椒,煸出香味开大火,放入黄豆芽翻炒 步骤 5 - 几分钟后,加入粉条,烹入蚝油和生抽,翻炒,加少许水 步骤 6 - 待豆芽和粉条都熟,加少许盐调味即可 ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ |
附录
原本增加了每个步骤的配图,以便更好的理解步骤的,但是因为有些步骤是没有对应图片的。为了避免不必要的麻烦,就不加图片了,改成在菜谱名称边上显示对应菜谱的链接,方便查找。
立一个小flag,有空了再把这个做一个windows客户端和一个web端来玩玩好了。