前置准备
环境搭建
本次使用Python 3.10+(兼容性最优),提前安装以下库:
- requests:发送HTTP请求,获取页面源码或接口数据
- jsonpath:解析JSON格式的接口数据,提取目标字段
- os:创建本地文件夹存储图片
- time:控制请求频率,避免触发京东反爬
安装命令(Windows/macOS/Linux通用,打开终端/命令提示符执行):
```
pip install requests jsonpath
```
获取核心参数
本次爬取无需登录京东账号,仅抓取公开的买家秀(晒单/默认带图评价),需要2个核心参数:
- sku_id:京东商品唯一标识
- cookie:模拟浏览器身份,提高请求成功率(可选但强烈推荐)
参数获取步骤
获取sku_id
打开任意京东商品详情页(比如https://item.jd.com/100012043978.html),URL中「.html」前的数字100012043978就是sku_id,直接复制即可。
获取Cookie(可选但成功率提升80%)
1. 打开Chrome/Edge浏览器,访问京东首页(https://www.jd.com/),无需登录;
2. 按F12打开开发者工具,切换到「Network(网络)」选项卡;

3. 刷新页面,在Network的「Filter(筛选)」框输入「pingjia」;
4. 点击任意名称包含「pingjia」的请求,在右侧「Headers(请求头)」面板找到「Request Headers」下的「Cookie」字段,复制完整内容(注意不要复制多余空格或换行)。
代码实现
创建一个名为jd_buyer_show.py的Python文件,将以下完整代码复制进去,根据提示修改核心参数即可运行:
```
import requests
import jsonpath
import os
import time
import random
- 修改区域 START -
SKU_ID = "100012043978" 替换为你要爬取的商品sku_id
COOKIE = "你刚才复制的完整Cookie" 如果没获取Cookie,填空字符串""
SAVE_FOLDER = f"jd_buyer_show_{SKU_ID}" 自动生成带sku_id的本地存储文件夹
PAGE_COUNT = 5 爬取的买家秀页数,每页约10条带图评价
- 修改区域 END -
初始化请求头
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Referer": f"https://item.jd.com/{SKU_ID}.html",
"Cookie": COOKIE if COOKIE else ""
}
创建本地存储文件夹
if not os.path.exists(SAVE_FOLDER):
os.makedirs(SAVE_FOLDER)
print(f"已创建存储文件夹:{SAVE_FOLDER}")
else:
print(f"存储文件夹已存在:{SAVE_FOLDER}")
def get_buyer_show(page):
"""
爬取指定页的买家秀数据
:param page: 页码,从0开始
:return: 图片URL列表
"""
京东公开买家秀接口(无需登录)
url = f"https://club.jd.com/comment/productPageComments.action?productId={SKU_ID}&score=0&sortType=5&page={page}&pageSize=10&isShadowSku=0&fold=1"
try:
发送GET请求,设置超时时间10秒
response = requests.get(url, headers=HEADERS, timeout=10)
强制设置响应编码为UTF-8,避免乱码
response.encoding = "UTF-8"
解析JSON数据
data = response.json()
提取图片URL列表(只提取带图评价)
img_urls = jsonpath.jsonpath(data, "$.comments[].images[].imgUrl")
JSONPath返回None时说明该页无图片,转成空列表
return img_urls if img_urls else []
except Exception as e:
print(f"第{page+1}页请求失败:{str(e)}")
return []
def download_img(img_url, img_index, page_index):
"""
下载单张图片
:param img_url: 图片原始URL
:param img_index: 图片在当前页的序号
:param page_index: 当前页码(从0开始)
"""
图片原始URL是缩略图,替换成高清图URL
hd_img_url = img_url.replace("s128x96_jfs", "jfs")
try:
发送图片请求
img_response = requests.get(hd_img_url, headers=HEADERS, timeout=10)
构造本地保存路径
img_path = os.path.join(SAVE_FOLDER, f"page_{page_index+1}_img_{img_index+1}.jpg")
写入图片文件
with open(img_path, "wb") as f:
f.write(img_response.content)
print(f"已下载:{img_path}")
except Exception as e:
print(f"图片下载失败:{hd_img_url},错误原因:{str(e)}")
if __name__ == "__main__":
total_img_count = 0
循环爬取指定页数
for page in range(PAGE_COUNT):
print(f"-- 开始爬取第{page+1}页 --")
img_urls = get_buyer_show(page)
if not img_urls:
print(f"第{page+1}页无带图评价,跳过")
continue
循环下载当前页所有图片
for img_idx, img_url in enumerate(img_urls):
download_img(img_url, img_idx, page)
total_img_count += 1
随机休眠0.5-2秒,控制请求频率
time.sleep(random.uniform(0.5, 2))
每页爬完后额外随机休眠1-3秒
time.sleep(random.uniform(1, 3))
print(f"-- 爬取完成!共下载{total_img_count}张买家秀图片 --")
```
关键代码说明
接口URL解析
京东公开买家秀接口URL参数固定格式如下,无需额外改动:
- productId:商品sku_id
- score:评价分数(0=全部,1=差评,2=中评,3=好评,这里用0抓所有带图评价)
- sortType:排序方式(5=最新评价,3=默认推荐,可根据需求修改)
- page:页码(从0开始计数)
- pageSize:每页评价条数(最大10,超过会被京东限制)
高清图片替换逻辑
接口返回的图片原始URL是「s128x96_jfs」开头的128×96缩略图,替换成「jfs」开头即可获取原尺寸高清图,无需其他处理。
反爬控制
代码中加入了3个反爬措施,可大幅降低触发京东IP限制的概率:
- 添加真实的User-Agent和Referer
- 随机休眠0.5-2秒(单张图片下载间隔)
- 随机休眠1-3秒(单页爬取间隔)
注意事项
- 仅用于个人学习/研究,不得批量爬取后用于商业用途,遵守《网络安全法》和京东《用户协议》
- 如果触发IP限制(请求返回403/503),可:
- 等待10-30分钟后再试
- 更换网络环境(比如切换手机热点)
- 重新获取Cookie(即使未登录,京东偶尔会更新临时Cookie)
- PAGE_COUNT建议不超过20,避免对京东服务器造成压力
- 如果图片无法下载,检查网络连接或替换的高清图URL是否正确