一个蝉鸣沉醉的晚上,我和女神坐在沙发上,呆呆地看着鱼缸里的小鱼儿自由自在地游来游去。
突然,女神摸着自己的肚子,惊叹一声:哇!三个月大了!
我怔了一下,急切地问道:啥时候的事?怎么不告诉我?
“就这几个月呀!不知不觉就长了这么多膘!”
“我靠!我还以为你有了!”
女神嘤嘤地锤着我的胸,喊着要减肥!
“没问题,我助你!”
所谓“管住嘴,迈开腿!”减肥也是有方法论的,我们要用科学的方法减肥。管住嘴,不是不吃,而是要保证每天摄入的能量小于每天消耗的能量。
我还在说着方法论,女神已经打开手机,在网上搜减肥食谱了,看来是真的下决心了。
咱也不能落后呀,我看到她在一个叫“美食杰”的网页上看菜谱,我就说不需要这么麻烦,一页一页地翻太累了,给我5分钟,我给你这个网站上所有的减肥食谱。
准备食材
我打开电脑,在浏览器上输入网址,然后迅速地定位到“减肥食谱”的分类上:
![](https://img.haomeiwen.com/i10873165/f32b0b28ef7c2230.png)
打开这个菜谱页面,我发现这个页面是以卡片的形式来呈现每一个菜谱,然后底下是分页。
![](https://img.haomeiwen.com/i10873165/ce9dbc05bad5ecc2.png)
对于分页的页面,我们首先看 URL 的变化,如果 URL 有规律,那就很容易解决,这个页面的分页恰巧是 URL 上可以体现页码的变化(第二一页是 p2 结尾):
接着,我们来看每个菜谱的细节:
![](https://img.haomeiwen.com/i10873165/1a995041b821d858.png)
我们可以看到这个页面很有规律,每个菜谱和其对应的材料都是一样的格式。
有了这些基础,我的思路就很清晰了:
通过拼接 URL 实现分页查询,通过解析相同格式的 HTML 页面来获取菜谱和材料。
烹饪
我写一个方法,请求页面,然后从页面中解析出菜名和材料,由于不同的菜谱中使用的材料可能会有重复,所以我对材料做了去重处理。
import requests
from lxml import etree
def getRecipe(url, pageNum, foodFileName, meterialFileName):
foods = []
meterials = []
for i in range(1, pageNum):
rurl = url % i # 构建网址,用网址前半部分相同的,拼接后边的数字
res = requests.get(rurl).text # 用requests库的get函数来获得网页数据
res_xpath = etree.HTML(res) # 将获得的数据转化为xpath格式
foods.extend(res_xpath.xpath('//*/a[@class="list_s2_item_info"]/strong/text()')) # 用浏览器获得所需信息的xpath位置
meterial = res_xpath.xpath('//*/a[@class="list_s2_item_info"]/span[@class="sc"]/text()')
for m in meterial:
meterials.extend(m.split(','))
for food in foods: # 依次从获得的总食谱中提取菜名
with open(foodFileName + ".txt", 'a', encoding="utf-8") as f:
f.write(food + '\n')
undupMeterials = list(set(meterials)) # 对材料去重
for m in undupMeterials:
with open(meterialFileName + ".txt", 'a', encoding="utf-8") as f:
f.write(m + '\n')
return foods, undupMeterials
fitfoods, fitmeterials = getRecipe('https://www.meishij.net/jiankang/jianfei/p%s/', 6, 'fitfood', 'fitmeterial')
下碟
最后的结果我将菜谱和食材分别写到两个文件中,然后将文件发给女神了。
女神掐表一算,说:亲爱的,你太快了!
我翻了一个白眼,说到:下次不要这样说,要说“亲爱的,你太帅了!”。
她锤了了一下,红着脸说“你真坏!”
网友评论