Python爬虫学习笔记_DAY_24_Python爬虫之bs4解析实战篇_批量下载Starbucks咖啡图片【Python爬虫】

p.s.高产量博主,点个关注💓不迷路!

目录

I.实战目标确定

II.分析与准备工作

III.代码的编写步骤

IV.完整源码


I.实战目标确定

首先,我们确定一下本次实战的目标:获取Starbucks菜单页中的部分图片,下面是Starbucks的菜单页的展示图

由于出于复习巩固bs4语法的目的,我们不爬取过多的图片以免给Starbucks网站造成太多的访问资源浪费(学习爬虫要讲武德!)。这是爬取的部分图片的展示

上面是我们本次实战的目标确定,如果对bs4的安装和基础语法不了解的朋友,可以先看一下这篇bs4基础博客


II.分析与准备工作

接下来,按照传统的步骤,我们开始抓接口、分析解析的逻辑

1️⃣ 首先,我们进入Starbucks菜单页

接下来,按F12,开启网页的检查模式(右键选择检查也可以):


2️⃣ 之后,我们在Network项中的最左侧Name一栏进行粗略的查找,经过一些对比,真正的接口在这个menu/文件中

选中menu/,之后在Headers中复制URL项,作为获取响应的url地址,同时注意到它是一个get请求,因此我们无需额外传递参数


3️⃣ 接口获取后,我们开始分析如何解析我们需要的内容。首先我们拆分一下任务:我们需要解析两项内容图片图片对应的名称前者是图片的地址,后者是一个字符串。我们首先先考虑解析图片对应的名称,于是点击menu/中的Response,这个Response代表了返回给我们的response的内容

通过上图,我们以第一个图片的名称为例,可以看到名称被放在<strong></strong>标签中,这个<strong></strong>标签本身没有其他的属性值,因此我们需要借助其他的标签定位到strong:此时优先考虑它的父标签ul > li > strong,也即这个strong标签在ul标签内部的一个li标签内由于li标签也没有属性值,我们考虑用它的“爷爷”标签ul辅助定位,因此bs4解析的语句应该是:

ul[class = "grid padded-3 product"] strong


4️⃣ 最后我们尝试解析一下图片的路径,它的思路与上面的图片名称类似,我们观察后发现:

可以看出,此时图片并不是用一个img标签,而是通过background-image属性作为背景图放在网站上的。于是我们的目的变成了提取ul标签下每一个li标签中的div标签中style属性的属性值:

ul[class = "grid padded-3 product"] div

之后我们需要对获取的style属性值做一些基础的字符串处理,以裁剪出需要的链接部分。

另外补充一点此时在background-image属性中的url值并不是图像的完整url,我们可以通过分析Starbucks网站上的任意一张图片获取完整的url

鼠标点击一下任意一种图片的background-image的url属性上,右侧的style中能够看到一个url,此时我们把鼠标放在右侧style的url的值上面,会出现它的完整url

再把路径敲出来,发现完整链接是这样的

https://www.starbucks.com.cn/images/products/affogato.jpg

对比一下前面我们获取的图片的url,发现它需要拼接这样的一段内容

https://www.starbucks.com.cn

到此为止,所有准备工作均已完成,我们可以进行代码的书写


III.代码的编写步骤

接下来,我们开始编写代码:

1️⃣ 首先,我们先学习一下如何用bs4处理服务器响应文件

from bs4 import BeautifulSoup

soup = BeautifulSoup(content,'lxml')

上一篇笔记中仅了解了如何处理本地的html文件,服务器的响应应当用上述的格式进行书写:使用Beautifulsoup()函数,传入两个参数,第一个参数是服务器的响应的内容第二个参数是'lxml’这个固定的参数


2️⃣ 书写基础爬虫语句,获取服务器的响应:

import urllib.request

url = "https://www.starbucks.com.cn/menu/"

headers = {
                'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
         }

request = urllib.request.Request(url = url,headers = headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

这部分是我们比较熟悉的流程,因此不做解释,不了解的朋友可以查看之前的博客!其中url是我们前面准备工作抓取的接口url


3️⃣ 定义bs4语句:

from bs4 import BeautifulSoup

soup = BeautifulSoup(content,'lxml')

basic_url = "https://www.starbucks.com.cn"

name_list = soup.select('ul[class = "grid padded-3 product"] strong')

img_url_list = soup.select('ul[class = "grid padded-3 product"] div')

通过之前分析的bs4语句,我们拿到了所有的图片名称和图片部分路径的列表,同时我们定义了图片路径的前一部分,作为basic_url两部分拼接后,我们就可以访问和下载图片了


4️⃣ 循环下载图片:

for i in range(0,5):
    current_style = img_url_list[i].attrs.get("style")

    current_url_link = basic_url + current_style.split('(')[1].split(')')[0].replace('"','')

    urllib.request.urlretrieve(url = current_url_link, filename = '.\\Starbucks\\' + name_list[i].get_text() + '.jpg')

最后,我们循环去下载图片:

首先,我们获取当前的style属性的属性值,前面提到了style属性的属性值是这样的

background-image: url("/images/products/affogato.jpg")

我们只需要 /images/products/affogato.jpg 这部分,因此我们需要进行字符串的裁剪,裁剪的思路是通过 "("  和  ")"  进行切割

两段链接拼接后,得到了最终的链接,放在current_url_link中,于是我们调用urllib.request.urlretrieve()函数,下载图片

最后的最后,强调我们学习的目的,只下载前五张就好,请勿过多获取资料


IV.完整源码

下面是本次实战的完整源码,仅供参考学习:

# # 解析服务器响应文件:bs4的实战之Starbucks数据爬取与图片下载

import urllib.request

url = "https://www.starbucks.com.cn/menu/"

headers = {
                'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
         }

request = urllib.request.Request(url = url,headers = headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

from bs4 import BeautifulSoup

soup = BeautifulSoup(content,'lxml')

basic_url = "https://www.starbucks.com.cn"

name_list = soup.select('ul[class = "grid padded-3 product"] strong')

img_url_list = soup.select('ul[class = "grid padded-3 product"] div')



for i in range(0,5):
    current_style = img_url_list[i].attrs.get("style")

    current_url_link = basic_url + current_style.split('(')[1].split(')')[0].replace('"','')

    urllib.request.urlretrieve(url = current_url_link, filename = '.\\Starbucks\\' + name_list[i].get_text() + '.jpg')

【温馨提示】:运行之前,请先在与该python文件同级的文件夹下创建名为 Starbucks 文件夹,后续图片会下载到该文件夹内!🌟🌟🌟

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳探戈的小龙虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值