【python爬虫】13.吃什么不会胖(爬虫实操练习)

文章目录

  • 前言
  • 项目实操
    • 明确目标
    • 分析过程
    • 代码实现

前言

吃什么不会胖——这是我前段时间在健身时比较关注的话题。

相信很多人,哪怕不健身,也会和我一样注重饮食的健康,在乎自己每天摄入的食物热量。

不过,生活中应该很少有人会专门去统计自己每日摄入的食物热量。显然这样做多少有一些麻烦。可能你得下载一个专门查询热量的APP,填写食物的名字,一个个地去查询。

但其实利用爬虫,我们可以很简单就爬取到这些食物的热量信息,不用费力就能知道自己摄入了多少食物热量。

食物的数量有千千万,如果我们要爬取食物热量的话,这个数据量必然很大。

可能你会想到可以使用多协程来爬取。确实,使用多协程来爬取大量的数据是非常合理且明智的选择。

关于多协程的用法,我们在上一关已经讲过了,这里照旧简单复习一下。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第1张图片

项目实操

说回爬取食物热量的事,如果我们要爬取的话,那就得选定一个有存储食物热量信息的网站才能爬到数据。

我倒是知道一个这样的网站——薄荷网。它是一个跟健身减肥有关,且可以查询食物数据的网站。

我们选取这个网站进行食物热量的爬取的话,既能将上一关学到的协程知识实践起来,又能获得一份食物热量表,还是蛮两全其美的。

那么,我们这一关的项目就可以定为:用多协程爬取薄荷网的食物热量。

你也知道,我们在做一个项目时,不是上来就写代码的,最先要做的是明确目标。

明确目标

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第2张图片
现在,请你先用浏览器打开薄荷网的链接:

http://www.boohee.com/food/

打开了吗?一定要真的打开了哦!

简单浏览一下这个网站,你会发现一共有11个常见食物分类——

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第3张图片
点击【谷薯芋、杂豆、主食】这个分类,你会看到在食物分类的右边,有10页食物的记录,包含了这个分类里食物的名字,及其热量信息。点击食物的名字还会跳转到食物的详情页面。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第4张图片
至此,我们的项目目标可以定为:用多协程爬取薄荷网11个常见食物分类里的食物信息(包含食物名、热量、食物详情页面链接)。

分析过程

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第5张图片
目标明确好后,我们接着【分析过程】,这一步骤对于项目成功与否起着关键的作用。

我们可以从爬虫四步(获取数据→解析数据→提取数据→存储数据)入手,开始逐一分析。

想要获得食物热量的数据,我们得先判断这些数据具体存在哪里。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第6张图片

第7关的时候,我们讲过判断数据存储在哪里的方法。请你打开http://www.boohee.com/food/group/1网站,右击打开“检查”工具,并点击Network,然后刷新页面。点击第0个请求1,看Response
【python爬虫】13.吃什么不会胖(爬虫实操练习)_第7张图片

我们能在Response里找到食物的信息,说明我们想要的数据存在HTML里。

再看第0个请求1的Headers,可以发现薄荷网的网页请求方式是get。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第8张图片
知道了请求方式是get,我们就知道可以用requests.get()获取数据。

先关闭“检查”工具。我们接着来观察,每个常见食物分类的网址和每一页食物的网址有何规律。

点击第一个分类【谷薯芋、杂豆、主食】,网址显示的是:

http://www.boohee.com/food/group/1

点击第二个分类【蛋类、肉类及制品】,网址变成:

http://www.boohee.com/food/group/2

我们可以做个猜想:网址的group参数代表着常见食物分类,后面的数字代表着这是第几个类。

只要再多点击几个常见食物分类看看,就能验证我们的猜想。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第9张图片
果然,常见食物分类的网址构造是有规律的。前10个常见食物分类的网址都是:

http://www.boohee.com/food/group/+数字

唯独最后一个常见食物分类【菜肴】的网址与其他不同,是:

http://www.boohee.com/food/view_menu

每个常见食物分类网址的规律我们找到了。现在看回【谷薯芋、杂豆、主食】这个分类,点击翻到第2页的食物记录,我们看看网址又会发生怎样的变化。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第10张图片
网址从http://www.boohee.com/food/group/1变成了:

http://www.boohee.com/food/group/1?page=2

网址多了page这个参数。数字2是不是第2页的意思?我们往后再翻两页看看。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第11张图片
原来?page=数字真的是代表页数的意思。只要改变page后面的数字,就能实现翻页。

可是为什么第1页的食物记录的网址在最开始是:

http://www.boohee.com/food/group/1,没有加?page=1呢?

难道是网站默认不显示的?我们试下给http://www.boohee.com/food/group/1加上?page=1,看看会怎样。

http://www.boohee.com/food/group/1?page=1

你会发现,其实加上了?page=1,打开的同样还是第1页的食物记录。

基于我们上面的观察,可以得出薄荷网每个食物类别的每一页食物记录的网址规律——

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第12张图片
接下来,我们来分析怎么解析数据和提取数据。

前面我们知道薄荷网的食物热量的数据都存在HTML里,所以等下就可以用BeautifulSoup模块来解析。

至于怎么提取数据,我们得先弄清楚HTML的结构才行。

【python爬虫】13.吃什么不会胖(爬虫实操练习)_第13张图片
右击打开“检查”工具,看Elements,点击光标,把鼠标移到食物【Easy Fun 紫薯营养粥】这里,会发现在

  • 元素下,藏有食物的信息,包括食物详情的链接、食物名和热量。

    你点击href=“/shiwu/fdd9b123”,就会跳转到【Easy Fun 紫薯营养粥】的详情页面。

    【python爬虫】13.吃什么不会胖(爬虫实操练习)_第14张图片
    你再把鼠标接着移到其他食物上,你就会发现:原来每个食物的信息都被分别藏在了一个

  • 标签里。每页食物记录里有10个食物,刚好对应上网页源代码里的10个
  • 标签。

    【python爬虫】13.吃什么不会胖(爬虫实操练习)_第15张图片
    这么看来的话,我们用find_all/find就能提取出

    你可能感兴趣的:(python爬虫,python,爬虫,开发语言,网络爬虫)