需求分析
这两天,有关于菜刀能否用来拍蒜的问题,非常的火爆。有人说,他家里的菜刀就是在市场买的,总共也没花几十块,用了几十年还能照常拍蒜。也有人说,他买了外国进口的菜刀,花了小几千,但是一拍蒜就坏了,不能用了。那么这个菜刀到底能不能拍蒜呢?
有材料学的大佬科普说,“菜刀不能用来拍蒜是有道理的,因为越是硬度高的材料,越不容易变形,那么在用刀的切面去拍打食物的时候,就容易导致断裂,这是错误的用法!但是这种刀非常的有好处,它可以长时间保持锋利,不需要经常磨。所以说,术业有专攻,如果你希望刀能够保持锋利,就不要拿这种刀来拍打食物。”
好吧,关于物理啊,还是材料啊,我是一个字都不懂,但是呢,这个结论我听懂了,也就是说,如果你希望菜刀能够拍蒜,就应该买普通的家用菜刀,避免使用更加锋利的片刀或者厨刀
其实吧,我觉得,对于一个非专业厨师的我来说,菜刀能够拍蒜还是很重要的,那么,买这样一把能够拍蒜的菜刀,到底要花多少钱呢?这个问题我觉得也很简单,我们只需要爬取一下家用菜刀的价格,就可以知道了。哦对了,按照专家的说法,家用菜刀都是可以拿来拍蒜的。如果不可以的话,那不是我的问题哦,需要找专家理论去
实现分析
爬取家用菜刀的价格,其实,前不久我还真做过一个类似的程序,就是爬取雪糕刺客的价格,很显然,这次的情况和上次也差不许多,只要把雪糕换成菜刀,就可以完成任务了大概
当然,如果你看过那篇文章的话,也许还会记得,直接通过requests爬取价格是不行的,因为这里存在js的动态渲染,商品的价格是通过js写入到页面之中的,因此如果我们直接发送requests请求的话,是没有办法得到数据的
为了能够解决js渲染问题,上一次我们采用了selenium启动了浏览器解决了这一个问题。这一次呢,为了和之前不同,我们也是尝试采用一下splash解决这个问题。当然啦,之前关于splash的使用,我已经有多篇文章讲述过了,如果你还不知道的话,那么可以看看我的这篇文章,学习splash的简单使用,那么,就开始了
原本通过selenium的时候,我们需要启动一个浏览器,控制该浏览器访问页面,然后返回driver.page_source。但是在splash的使用中,我们不需要做这些了,只需要请求对应的splash的render.html接口,就能解决这一问题了。所以说,splash真的很好用啊,不是吗
另外,唯一需要注意的是,如果我们希望了解到商品的价格,肯定是通过价格对其进行排序比较好,这样我们就可以清楚的观察到价格低的是多少,价格高的是多少了。当然啦,排序也是很简单的,自然不需要我们自己写什么排序方法,只需要使用python中的sorted就可以了
完整代码展示
import requests
from base64 import b64decode
from parsel import Selector
url = b64decode("aHR0cHM6Ly93d3cuamQuY29tL2NoYW5waW4vMjYzNjgzLmh0bWw=").decode()
url = "http://localhost:8050/render.html?url=" + url
r = requests.get(url)
s = Selector(r.text)
item_list = list()
item = s.xpath("//div[@class='gl-i-wrap']")
for i in item:
title = i.xpath(".//a/em/text()").get()
price = i.xpath(".//div[@class='p-price']//i/text()").get()
item_list.append({
"标题": title,
"价格": float(price)
})
item_list = sorted(item_list, key=lambda x: x["价格"])
for i in item_list:
print("商品名:" + i["标题"])
print("价格:" + str(i["价格"]) + "元")
print()
程序运行结果展示如下
从这里,我们可以发现,原来买一个能拍蒜的菜刀,真的不是很贵,最便宜的只需要十多块钱就可以买到了
本次使用的splash服务,依然是本地搭建的splash,使用的端口是默认的8050。因此我们才可以通过http://localhost:8050进行访问
注意,如果你在本地没有运行splash的服务的话,是不能够直接运行这个代码哦,这会导致程序运行不成功