1.爬前须知
由于网站限制,每个商品只能爬取1000条数据。
2.获取URL
JD京东爬虫-商品评论爬虫-----附源码_京东评论url的json解析-CSDN博客
3.爬虫代码
来源:python爬虫 爬取京东商品评论(争取爬下尽量多的数据) - 知乎 (zhihu.com)
# coding='utf-8'
import requests
import json
import time
import random
import xlwt
import xlutils.copy
import xlrd
def start(page):
# 获取URL
#score 评价等级 page=0 第一页 producitid 商品类别
url = 'https://club.jd.com/comment/productPageComments.action?&productId=100008054085&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
# url = 'https://club.jd.com/comment/productPageComments.action?&productId=100016647456&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
headers= {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"
}
time.sleep(2)
test = requests.get(url=url, headers= headers)
data = json.loads(test.text)
return data
# 解析页面
def parse(data):
items = data['comments']
for i in items:
yield (
i['nickname'],#用户名自
i['id'], #用户id
i['content'],#内容
i['creationTime']#时间
)
def excel(items):
#第一次写入
newTable = "test.xls"#创建文件
wb = xlwt.Workbook("encoding='utf-8")
ws = wb.add_sheet('sheet1')#创建表
headDate = ['id', '内容', '时间']#定义标题
for i in range(0,3):#for循环遍历写入
ws.write(0, i, headDate[i], xlwt.easyxf('font: bold on'))
index = 1#行数
for data in items:#items是十条数据 data是其中一条(一条下有三个内容)
for i in range(0,3):#列数
print(data[i])
ws.write(index, i, data[i])#行 列 数据(一条一条自己写入)
print('______________________')
index += 1#等上一行写完了 在继续追加行数
wb.save(newTable)
def another(items, j):#如果不是第一次写入 以后的就是追加数据了 需要另一个函数
index = (j-1) * 10 + 1#这里是 每次写入都从11 21 31..等开始 所以我才传入数据 代表着从哪里开始写入
data = xlrd.open_workbook('test.xls')
ws = xlutils.copy.copy(data)
# 进入表
table = ws.get_sheet(0)
for test in items:
for i in range(0, 3):#跟excel同理
print(test[i])
table.write(index, i, test[i]) # 只要分配好 自己塞入
print('_______________________')
index += 1
ws.save('test.xls')
def main():
j = 1#页面数
judge = True#判断写入是否为第一次写入
for i in range(0, 100):
time.sleep(1.5)
#记得time反爬 其实我在爬取的时候没有使用代理ip也没给我封 不过就当这是个习惯吧
first = start(j)
test = parse(first)
if judge:
excel(test)
judge = False
else:
another(test, j)
print('第' + str(j) + '页抓取完毕\n')
j = j + 1
if __name__ == '__main__':
main()
#这个代码仅为全部数据下的评论而已 中差评等需要修改score!
4.实例及结果
爬取商品:完美日记口红
网站:https://item.jd.com/100012348704.html
参考上述代码爬取效果:
共爬取100页。
5.单条评论JSON
{
"jwotestProduct": null,
"score": 0,
"comments": [
{
"id": 20503895226,
"guid": "1a563db923b03d0bcdcc3c42d0f35167",
"content": "用着挺好的,香气也是挺好闻的。效果也是挺好。\n产品外观:挺不错。\n保湿效果:可以的。\n持久效果:嗯嗯,用着还是挺不错。\n轻薄程度:摸着也是很凉爽的。\n\n膏体气味:沁人心脾,舒服的很!",
"vcontent": "用着挺好的,香气也是挺好闻的。效果也是挺好。\n{$%&产品外观:&%$}挺不错。\n{$%&保湿效果:&%$}可以的。\n{$%&持久效果:&%$}嗯嗯,用着还是挺不错。\n{$%&轻薄程度:&%$}摸着也是很凉爽的。\n\n{$%&膏体气味:&%$}沁人心脾,舒服的很!",
"creationTime": "2024-02-23 21:23:38", #评论时间
"isDelete": false,
"isTop": false,
"userImageUrl": "misc.360buyimg.com/user/myjd-2015/css/i/peisong.jpg",
"topped": 0,
"replyCount": 0, #回复数量
"score": 5, #打分
"imageStatus": 1,
"usefulVoteCount": 1, #有用性投票
"userClient": 4,
"discussionId": 1467879167,
"imageCount": 2,
"anonymousFlag": 1,
"plusAvailable": 201,
"mobileVersion": "12.4.0",
"images": [
{
"id": -1816569352,
"imgUrl": "//img30.360buyimg.com/n0/s128x96_jfs/t1/89031/13/43955/22615/65d89c58F5450a35b/2eda674422844065.jpg",
"imgTitle": "",
"status": 0
},
{
"id": -1816569351,
"imgUrl": "//img30.360buyimg.com/n0/s128x96_jfs/t1/9869/27/23553/37887/65d89c59Feea7278e/413afaccea7b3cfa.jpg",
"imgTitle": "",
"status": 0
}
],
"mergeOrderStatus": 2,
"productColor": "丝绒迷你套组 V01+V02+V07+V08",
"productSize": "",
"textIntegral": 20,
"imageIntegral": 20,
"ownId": 1000118121,
"ownType": 0,
"extMap": {
"buyCount": 2
},
"location": "河南",
"status": 1,
"referenceId": "100007191937",
"referenceTime": "2024-02-18 09:25:56",
"nickname": "j***a",
"replyCount2": 0,
"userImage": "misc.360buyimg.com/user/myjd-2015/css/i/peisong.jpg",
"orderId": 0,
"integral": 40,
"productSales": "[]",
"referenceImage": "jfs/t1/197438/34/41020/40117/65e97346F1567f5ff/eb72d41533fa2bf4.jpg",
"referenceName": "完美日记至臻柔色丝绒唇釉V01复古红梨色2.5g口红显白38女神节礼物送女友",
"firstCategory": 1316,
"secondCategory": 1387,
"thirdCategory": 16857,
"aesPin": null,
"days": 5,
"afterDays": 0
},
score是评论的数据的类型:
- 0为全部评论
- 1是差评
- 2是中评
- 3是好评
- 5是追评
6.改进后代码
根据我的数据需求,增加【score】评论类型,增加【imagecount】图片的数量,增加【productColor】消费者购买的产品种类,增加【usefulVoteCount】有用性投票,增加【creationTime】评论时间
另外发现一个问题,源代码没有能够实现翻页的操作,结果是10条重复了100词得到1000条数据,因此我修改了url的格式。此代码爬取的是京东网页中兰蔻口红数据。
url = "https://api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments&client=pc&clientVersion=1.0.0\ &t=1709984938800&loginType=3&uuid=181111935.17096300437011266491668.1709630043.1709967471.1709984783.7&productId=100046685764&score=0&sortType=5&page={0}&pageSize=10".format(page)
import requests
import json
import time
import random
import xlwt
from xlutils.copy import copy
import xlutils
import xlrd
def start(page):
url = "https://api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments&client=pc&clientVersion=1.0.0\
&t=1709984938800&loginType=3&uuid=181111935.17096300437011266491668.1709630043.1709967471.1709984783.7\
&productId=100046685764&score=0&sortType=5&page={0}&pageSize=10".format(page)
headers= {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/53\
7.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"
}
time.sleep(2)
test = requests.get(url=url, headers= headers)
data = json.loads(test.text)
return data
# 解析页面
def parse(data):
items = data['comments']
for i in items:
yield (
i['nickname'],#用户名自
i['id'], #用户id
i['content'],#内容
i['creationTime'],#时间
i['score'],#打分
i['productColor'],
i['usefulVoteCount']
)
def excel(items):
#第一次写入
newTable = "test.xls"#创建文件
wb = xlwt.Workbook("encoding='utf-8")
ws = wb.add_sheet('sheet1')#创建表
headDate = ['nickname', 'id', 'content','time','score','productcolor','usefulvotecount']#定义标题
for i in range(0,7):#for循环遍历写入
ws.write(0, i, headDate[i], xlwt.easyxf('font: bold on'))
index = 1#行数
for data in items:#items是十条数据 data是其中一条(一条下有三个内容)
for i in range(0,7):#列数
print(data[i])
ws.write(index, i, data[i])#行 列 数据(一条一条自己写入)
print('______________________')
index += 1#等上一行写完了 在继续追加行数
wb.save(newTable)
def another(items, j):#如果不是第一次写入 以后的就是追加数据了 需要另一个函数
index = (j-1) * 10 + 1#这里是 每次写入都从11 21 31..等开始 所以我才传入数据 代表着从哪里开始写入
data = xlrd.open_workbook('test.xls')
ws = xlutils.copy.copy(data)
# 进入表
table = ws.get_sheet(0)
for test in items:
for i in range(0, 7):#跟excel同理
print(test[i])
table.write(index, i, test[i]) # 只要分配好 自己塞入
print('_______________________')
index += 1
ws.save('test.xls')
def main():
j = 0#页面数
judge = True#判断写入是否为第一次写入
for i in range(0, 100):
j = j + 1
time.sleep(1.5)
first = start(j)
test = parse(first)
if judge:
excel(test)
judge = False
else:
another(test, j)
print('第' + str(j) + '页抓取完毕\n')
if __name__ == '__main__':
main()
得到的结果: