基于 Python 实现的京东商品评论爬虫
核心需求是能爬取指定商品的评论数据(如评论内容、评分、时间等),并保证代码可运行、易理解。
实现思路
- 分析接口:京东评论数据通过 Ajax 异步加载,可直接请求评论接口获取 JSON 数据,无需解析复杂 HTML,效率更高。
- 构造请求:模拟浏览器请求头,避免被反爬;按页码构造评论接口的 URL。
- 数据解析:提取 JSON 中的核心字段(评论内容、评分、评论时间、用户昵称等)。
- 数据保存:将爬取的评论保存为 CSV 文件,方便后续分析。
- 异常处理:处理请求失败、数据解析错误等情况,保证爬虫稳定性。
完整代码
import requests
import json
import csv
import time
import random
from urllib.parse import urlencode
# 配置项
PRODUCT_ID = "100060195858" # 京东商品 ID(可从商品链接中获取)
PAGE_NUM = 10 # 要爬取的页数
CSV_FILE = "jd_comments.csv" # 保存评论的 CSV 文件名
# 请求头(模拟浏览器,避免被反爬)
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/{PRODUCT_ID}.html",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive"
}
def get_jd_comments(product_id, page):
"""
获取单页评论数据
:param product_id: 商品 ID
:param page: 页码
:return: 评论列表(字典格式)
"""
# 京东评论接口(经过验证的通用接口)
base_url = "https://club.jd.com/comment/productPageComments.action?"
params = {
"callback": ,
: product_id,
: ,
: ,
: page - ,
: ,
: ,
:
}
url = base_url + urlencode(params)
:
response = requests.get(url, headers=HEADERS, timeout=)
response.raise_for_status()
json_data = response.text.lstrip(params[] + ).rstrip()
data = json.loads(json_data)
comments = []
comment data.get(, []):
comment_info = {
: comment.get(, ),
: comment.get(, ).replace(, ).strip(),
: comment.get(, ),
: comment.get(, ),
: comment.get(, ),
: comment.get(, ).replace(, ).strip()
}
comments.append(comment_info)
comments
requests.exceptions.RequestException e:
()
[]
json.JSONDecodeError e:
()
[]
Exception e:
()
[]
():
comments:
headers = [, , , , , ]
(file_path, , encoding=) f:
writer = csv.DictWriter(f, fieldnames=headers)
f.tell() == :
writer.writeheader()
writer.writerows(comments)
__name__ == :
()
(CSV_FILE, , encoding=) f:
total_comments =
page (, PAGE_NUM + ):
()
comments = get_jd_comments(PRODUCT_ID, page)
comments:
save_comments_to_csv(comments, CSV_FILE)
total_comments += (comments)
()
:
()
time.sleep(random.uniform(, ))
()

