持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
开始
首先先请求星巴克的菜单页。然后获取到网页信息。使用Beautifulsoup解析成对象,然后使用select方法获取所有class 为grid的dom里面的所有strong,这样就锁定了所有商品名称,
ssl._create_default_https_context = ssl._create_unverified_context
import urllib.request
url = 'https://www.starbucks.com.cn/menu/'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
from bs4 import BeautifulSoup
soup = BeautifulSoup(content, 'lxml')
menu_list = soup.select(".grid strong")
for strong in menu_list:
print(strong.get_text())
图片地址也是一样处理,是在class 为grid的dom里面的class为preview的dom上,然后获取这个dom上的style属性,然后使用get方法获取到style属性,再使用split分割"双引号。取出列表中第二项,也就是下标为1项,就是我们要的图片地址,但是这个地址是相对地址,所以,我们要拼接一下网站根目录地址https://www.starbucks.com.cn/,这样就可以获取最终地址,然后使用urllib.request.urlretrieve方法传入url=图片地址,filename=商品名,下载即可。ps商品名中有/,所以路径会认为是目录,然后找不到就报错了,所以要使用replace方法把名称中的/替换掉。
需要先创建一个xbkImage目录,否则会报错的
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import urllib.request
url = 'https://www.starbucks.com.cn/menu/'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
from bs4 import BeautifulSoup
soup = BeautifulSoup(content, 'lxml')
menu_list = soup.select(".grid strong")
img_list = soup.select(".grid .preview")
for i in range(0, len(menu_list)):
name = menu_list[i].get_text().replace('/','')
img = 'https://www.starbucks.com.cn/' + img_list[i].attrs.get('style').split('"')[1]
urllib.request.urlretrieve(url=img, filename='./xbkImage/' + name + '.jpg')
到此,素材已经下载完成。然后就可以在xbkImage目录下看到所有的图片了,直接开店。 其实bs4的api非常友好,然后抓取星巴克的难点其实是在图片的名字不能有斜杠,还有就是图片地址不可以是绝对路径,必须拼接上完成路径才能正常下载,还有一个就是图片在属性里的提取方式。其他的问题还好。