美文网首页
[面向对象编程]女神要减肥,python打辅助!

[面向对象编程]女神要减肥,python打辅助!

作者: 闲欢 | 来源:发表于2021-06-18 21:27 被阅读0次

    一个蝉鸣沉醉的晚上,我和女神坐在沙发上,呆呆地看着鱼缸里的小鱼儿自由自在地游来游去。

    突然,女神摸着自己的肚子,惊叹一声:哇!三个月大了!

    我怔了一下,急切地问道:啥时候的事?怎么不告诉我?

    “就这几个月呀!不知不觉就长了这么多膘!”

    “我靠!我还以为你有了!”

    女神嘤嘤地锤着我的胸,喊着要减肥!

    “没问题,我助你!”

    所谓“管住嘴,迈开腿!”减肥也是有方法论的,我们要用科学的方法减肥。管住嘴,不是不吃,而是要保证每天摄入的能量小于每天消耗的能量。

    我还在说着方法论,女神已经打开手机,在网上搜减肥食谱了,看来是真的下决心了。

    咱也不能落后呀,我看到她在一个叫“美食杰”的网页上看菜谱,我就说不需要这么麻烦,一页一页地翻太累了,给我5分钟,我给你这个网站上所有的减肥食谱。

    准备食材

    我打开电脑,在浏览器上输入网址,然后迅速地定位到“减肥食谱”的分类上:

    image.png

    打开这个菜谱页面,我发现这个页面是以卡片的形式来呈现每一个菜谱,然后底下是分页。

    image.png

    对于分页的页面,我们首先看 URL 的变化,如果 URL 有规律,那就很容易解决,这个页面的分页恰巧是 URL 上可以体现页码的变化(第二一页是 p2 结尾):

    https://www.meishij.net/jiankang/jianfei/p2/

    接着,我们来看每个菜谱的细节:

    image.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')
    
    

    下碟

    最后的结果我将菜谱和食材分别写到两个文件中,然后将文件发给女神了。

    女神掐表一算,说:亲爱的,你太快了!

    我翻了一个白眼,说到:下次不要这样说,要说“亲爱的,你太帅了!”。

    她锤了了一下,红着脸说“你真坏!”

    相关文章

      网友评论

          本文标题:[面向对象编程]女神要减肥,python打辅助!

          本文链接:https://www.haomeiwen.com/subject/arplyltx.html