文章概述
本文将介绍如何使用 Python 抓取好利来甜品的商品信息,并将这些信息保存到 CSV 文件中,同时还会下载每款甜品的封面图片到指定文件夹。我们将使用 requests
库来进行 HTTP 请求,使用 csv
库来写入 CSV 文件,并使用 os
库来处理文件和目录。
准备工作
在开始之前,请确保安装了以下 Python 库:
requests
:用于发送 HTTP 请求。csv
:用于处理 CSV 文件。os
:用于文件和目录操作。
可以通过 pip 安装所需的库:
pip install requests
代码实现
import csv
import json
import os
import requests# 初始化全局变量
list_url_id = []
id = 1 # 商品ID
type_id = 1 # 甜品类型ID# 创建封面的目录
# 使用 os.makedirs 而不是 os.mkdir 来避免错误
try:os.makedirs('好利来封面', exist_ok=True)
except Exception as e:print(f"目录创建失败: {e}")# 标题头
list_mulu = ['id', '商品名', '甜品价格', '甜品口味', '甜品规格', '保质期', '储蓄方式', '甜品类型id']# 写入 CSV 文件
with open('好利友.csv', 'w', encoding="gb18030", newline="") as fp:csv_writer = csv.writer(fp)csv_writer.writerow(list_mulu)# 定义请求头部
headers = {'Server': 'nginx/1.21.4','Date': 'Fri, 09 Jun 2023 03:39:16 GMT','Content-Type': 'text/html','Last-Modified': 'Sat, 03 Jun 2023 08:10:37 GMT','Transfer-Encoding': 'chunked','Connection': 'keep-alive','Vary': 'Accept-Encoding','ETag': 'W/"647af57d-179d"','via': '29f5b82c2e13','Content-Encoding': 'gzip'
}# 定义获取商品列表的函数
def List_url(i):data = {'platform': "pc", 'ver': "20211210", 'type_id': f"{i}", 'data_count': 0, 'word': ""}data2 = {'platform': "pc", 'ver': "20211210", 'type_id': f"{i}", 'data_count': 30, 'word': "", 'isNextPage': 'true'}reps = requests.post('https://api-mini-holiland.1900m.com/PcMallGoods/getGoodsList', data=data)reps.encoding = 'utf-8'pdaw = json.loads(reps.text)reps2 = requests.post('https://api-mini-holiland.1900m.com/PcMallGoods/getGoodsList', data=data2)reps2.encoding = 'utf-8'pdaw2 = json.loads(reps2.text)list_pdaw = pdaw['data']['list'] + pdaw2['data']['list']return list_pdaw# 定义解析和下载数据的函数
def Analysis_and_download(list_pdaw):global idglobal type_idfor pda in list_pdaw:if pda['goods_id'] in list_url_id:continuelist_url_id.append(pda['goods_id'])data2 = {'consignee_adcode': 411302001000,'goods_id': pda['goods_id'],'outlets_id': '3','platform': "pc",'ver': "20211210"}reps2 = requests.post('https://api-mini-holiland.1900m.com/MallGoods/detail', data=data2)json_reps = json.loads(reps2.text)['data']name = json_reps['name']url_cover = json_reps['cover_url']How_to_save = json_reps['storage_mode'] or '暂无'Expiration_date = json_reps['expiration_date'] or '暂无'flavor_name = json_reps['sku'][0]['flavor_name']Price = json_reps['sku'][0]['specification_list'][0]['price']Proposal = json_reps['sku'][0]['specification_list'][0].get('proposal', '')daxiao = json_reps['sku'][0]['specification_list'][0]['specification_name']guige = f'{daxiao}({Proposal})' or '暂无'# 下载封面with open(f'好利来封面/{id}.jpg', 'wb') as fp:fp.write(requests.get(url_cover).content)# 写入 CSV 文件with open('好利友.csv', 'a', encoding="gb18030", newline="") as fp:csv_writer = csv.writer(fp)csv_writer.writerow([id, name, Price, flavor_name, guige, Expiration_date, How_to_save, type_id])id += 1print(f"{name} 数据存储完成!")type_id += 1# 主程序
for i in range(3, 13):Analysis_and_download(List_url(i))print("所有数据抓取完成!")
注意事项
- API 访问限制:请检查 API 的访问频率限制,以免被封禁。
- 编码问题:本例中使用了 GB18030 编码以支持中文字符。
- 异常处理:代码中已加入了一些基本的异常处理,但在实际部署时可能还需要更多的健壮性测试。
结论
通过上述代码,我们可以轻松地抓取好利来甜品的相关信息,并将数据保存到 CSV 文件中,同时将封面图片下载到指定文件夹。这为后续的数据分析提供了便利。