文章概述
本文将介绍如何使用 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 id
global type_id
for pda in list_pdaw:
if pda['goods_id'] in list_url_id:
continue
list_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 += 1
print(f"{name} 数据存储完成!")
type_id += 1
# 主程序
for i in range(3, 13):
Analysis_and_download(List_url(i))
print("所有数据抓取完成!")
注意事项
- API 访问限制:请检查 API 的访问频率限制,以免被封禁。
- 编码问题:本例中使用了 GB18030 编码以支持中文字符。
- 异常处理:代码中已加入了一些基本的异常处理,但在实际部署时可能还需要更多的健壮性测试。
结论
通过上述代码,我们可以轻松地抓取好利来甜品的相关信息,并将数据保存到 CSV 文件中,同时将封面图片下载到指定文件夹。这为后续的数据分析提供了便利。