大家好,我是天空之城,今天给大家带来如何根据爬虫获得的食物卡路里、自身基础热量和运动消耗量计算总的热量差,这里涉及到了爬虫知识,数据的清洗和处理,以及简单的逻辑判断和计算。总的思路就是用获取的食物热量减去自身的基础热量和运动消耗的热量得到人体剩余的热量差。 先看下我们最后得到的效果图 输入食物名称,后台就已经获得了食物热量, 再输入性别等参数,就会计算出人体基础热量, 再输入运动量, 经过计算就会得到总共消耗的卡路里, 以及体内还剩余的卡路里
第一步,首先是通过爬虫获得所有食物的卡路里数据
import gevent,time,requests from bs4 import BeautifulSoup from gevent.queue import Queue from gevent import monkey monkey.patch_all() import openpyxl start=time.time() wb=openpyxl.Workbook() sheet=wb.active sheet.title='食物热量表' sheet['A1']='食物名称' sheet['B1']='网址' sheet['C1']='食物热量' url_list=[] for k in range(1,11): for j in range(1, 11): url_list.append('http://www.boohee.com/food/group/{}?page={}'.format(str(k),str(j))) for h in range(1,11): url_list.append('http://www.boohee.com/food/view_menu?page={}'.format(str(h))) #print(url_list) headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0', 'Referer':'http://www.boohee.com/food/group/1', 'Cookie':'Hm_lvt_7263598dfd4db0dc29539a51f116b23a=1588486427; Hm_lpvt_7263598dfd4db0dc29539a51f116b23a=1588487435' } work=Queue() for url in url_list: work.put_nowait(url) def getdata(): while not work.empty(): url=work.get_nowait() res=requests.get(url,headers=headers) #print(res.status_code) soup = BeautifulSoup(res.text, 'html.parser') items = soup.find('ul', class_='food-list') list = items.find_all('li') for film in list: name = film.find('h4').text link = film.find('a')['href'] wzlink='http://www.boohee.com'+link reliang = film.find('p').text print(name, wzlink, reliang) row=[name,wzlink,reliang] sheet.append(row) wb.save('食物热量对照表.xlsx') task_list=[] for x in range(5): task=gevent.spawn(getdata) task_list.append(task) gevent.joinall(task_list) end=time.time() print(end-start)获得excel数据截图如下
第二步,数据清洗和处理 对食物名称和卡路里经过简单数据处理,获得如下表格 食物从A列处理成B列(对食物名称进行精简,方便后面进行判断),食物热量从D列处理成E列(变成数值,方面后面计算)
第三步,程序实现过程,对数据进行读取和判断过程。 想要的效果就是,先输入你吃的食物名称,获取到相应的食物热量
import pandas as pd # df=pd.DataFrame(pd.read_csv('name.csv',header=1)) df=pd.DataFrame(pd.read_excel('食物热量对照表1.xlsx')) # print(df['食物名称'][0,10]) # print(df['食物热量1'][0,10]) # print(df.iloc[0,0]) # print(df.iloc[1,0]) dict={} list=[] for i in range(1100): # print(df.iloc[i, 1]) # print(df.iloc[i, 4]) a=df.iloc[i, 1] b=df.iloc[i, 4] dict[a]=b # list.append(dict) print(dict) while True: food=input('请输入你的食物名称:') if food in dict: print(dict[food]) else: print('你输入的食物不存在') break第四步,热量计算过程 在第三步中,我们获得了食物的热量,第四步就是输入人的性别,身高,体重和年龄计算基础热量,输入走的步数得到消耗热量,再用食物热量减去上述两个热量最后得到热量差,大功告成。
y_or_n = input('是否退出程序y/n?') while y_or_n != 'y': # '男 80 180 16' str_imfor = input('请您输入性别,体重(kg),身高(cm),年龄用空格隔开:') list_imfor = str_imfor.split(' ') print(list_imfor) gender = list_imfor[0] print(gender) weight = float(list_imfor[1]) print(weight) height = float(list_imfor[2]) print(height) age = int(list_imfor[3]) print(age) if gender =='男': bmr = (13.7*weight)+(5*height)-(6.8*age)+66 elif gender =='女': bmr = (9.6 * weight) + (1.8 * height) - (4.7 * age) + 655 else: bmr = -1 if bmr != -1: print("基础热量={",bmr,'}') else: print('暂时不支持该性别') walk = int(input('输入你走的步数:')) calories = walk * 28 print('今天共消耗卡路里:',calories+bmr) y_or_n = input('是否退出程序y/n?')完整的程序代码
import pandas as pd # df=pd.DataFrame(pd.read_csv('name.csv',header=1)) def foodca(): df=pd.DataFrame(pd.read_excel('食物热量对照表1.xlsx')) # print(df['食物名称'][0,10]) # print(df['食物热量1'][0,10]) # print(df.iloc[0,0]) # print(df.iloc[1,0]) dict={} list=[] for i in range(1100): # print(df.iloc[i, 1]) # print(df.iloc[i, 4]) a=df.iloc[i, 1] b=df.iloc[i, 4] dict[a]=b # list.append(dict) # print(dict) food=input('请输入你的食物名称:') if food in dict: calorie_food=dict[food] # print(calorie_food) return calorie_food else: print('你输入的食物不存在') def main(calorie_food): y_or_n = 'n' while y_or_n != 'y': # '男 80 180 16' str_imfor = input('请您输入性别,体重(kg),身高(cm),年龄用空格隔开:') list_imfor = str_imfor.split(' ') # print(list_imfor) gender = list_imfor[0] # print(gender) weight = float(list_imfor[1]) # print(weight) height = float(list_imfor[2]) # print(height) age = int(list_imfor[3]) # print(age) if gender =='男': bmr = (13.7*weight)+(5*height)-(6.8*age)+66 elif gender =='女': bmr = (9.6 * weight) + (1.8 * height) - (4.7 * age) + 655 else: bmr = -1 if bmr != -1: print("基础大卡={",bmr,'}') else: print('暂时不支持该性别') walk = int(input('请输入你走的步数:')) calories = walk * 28 print('今天共消耗卡路里是:',(calories+bmr)*0.001,'大卡') print('今天还剩卡路里是',calorie_food-(calories+bmr)*0.001,'大卡') y_or_n = input('是否退出程序y/n?') if __name__ == '__main__': y_or_n = input('是否退出程序y/n?') if y_or_n == 'n': mess=foodca() main(mess) else: print('欢迎下次使用') pass最后的效果图