前言
最近做了一个京东手机数据分析,从JD爬了一些手机的数据,这里简单介绍一下爬取手机评论的部分。
一、准备信息
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
首先我们准备的数据有:
- 已知手机的id,可以根据京东上一款手机的网址查询得到。
- 评论所在的url:
利用google chrome打开网站,右键“检查”,找到Network选项,然后刷新页面,点击商品评价,等待服务器向页面传递参数。
找到productPageComments点击,就会在右边Header中找到评论网址。
同时在header中也有cookie参数,将cookie参数复制到下面的代码相应位置。
将上述参数准备好后,可以运行下面代码
- 手机id
- 评论url网址
- cookie
二、详细代码
#胖虎Johnny
#2020.11.10
import urllib.request
import json
import random
import time as time0
import re,os
import pandas as pd
#设置代理
agents = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
def product_reviews(product_id = None,p = 0,maxPage = 99):
root_dir='京东手机评论_详细字典'
#判断之前是否爬取过这个型号手机的评论(一种型号的手机,颜色和内存不同,但评论共享)
os.makedirs(root_dir,exist_ok=True)
phone_list=os.listdir(root_dir)
phone_txt=str(product_id)+'.txt'
if phone_txt in phone_list:
print(product_id)
return []
#对每一页循环爬取
#"maxPage": 45
k_head=0
while p<maxPage:
#所有品牌评论
#url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId={}&score=0&sortType=5&page={}&pageSize={}&isShadowSku=0&rid=0&fold=1'
#只看当前商品的评论
url= 'https://club.jd.com/comment/skuProductPageComments.action?callback=fetchJSON_comment98&productId={}&score=0&sortType=5&page={}&pageSize={}&isShadowSku=0&fold=1'
url = url.format(product_id, p,maxPage)
#print(url)
# 仿造请求头,骗过浏览器
#cookie可以查找自己浏览器中的cookie,直接复制过来
cookie=''
headers = {
'User-Agent': ''.join(random.sample(agents, 1)),
'Referer': 'https://item.jd.com/1981570.html',
'Cookie':cookie
}
# 发起请求
request = urllib.request.Request(url=url, headers=headers)
time0.sleep(2.5)
# 得到响应ti'm
try:
content = urllib.request.urlopen(request).read().decode('gbk')
except:
print('第%d页评论代码出错' % p)
p=p+1
continue
# 去掉多余得到json格式
content = content.strip('fetchJSON_comment98vv995();')
#评论的最大页数
try:
maxPage=int( re.findall('"maxPage":(.*?),"',content,re.S)[0] )
except:
pass
try:
obj = json.loads(content)
except:
print('信号不好,再次尝试!')
print([content])
print(url)
continue
comments = obj['comments']
# 产品评论总结
productCommentSummary = obj['productCommentSummary']
dict_pars_info={}
# 平均分
dict_pars_info['平均分'] = str(productCommentSummary['averageScore'])
# 好评率
dict_pars_info['好评率'] = str(productCommentSummary['goodRate'])
# 当前总评论数
dict_pars_info['当前评论数'] = str(productCommentSummary['commentCount'])
# 默认评论数
dict_pars_info['默认评论数'] = str(productCommentSummary['defaultGoodCount'])
# 追评、好评、中评、差评
dict_pars_info['追评数'] = str(productCommentSummary['afterCount'])
dict_pars_info['好评数'] = str(productCommentSummary['goodCount'])
dict_pars_info['中评数'] = str(productCommentSummary['generalCount'])
dict_pars_info['差评数'] = str(productCommentSummary['poorCount'])
if len(comments)>0:
# print(comments)
for comment in comments:
# print(comment)
name = comment['referenceName']
id = comment['id']
con = comment['content']
time = comment['creationTime']
img_url = comment['userImageUrl']
score=comment['score']
likes=comment['usefulVoteCount']
replyCount=comment['replyCount']
try:
productColor = comment['productColor']
except:
productColor = ''
try:
productSize = comment['productSize']
except:
productSize = ''
item = {
'name': name,
'id': id,
'score': score,
'con': con,
'time': time,
'productColor':productColor,
'productSize':productSize,
'likes': likes,
'replyCount': replyCount,
'img_url': img_url,
}
item.update(dict_pars_info)
#print(item)
string = str(item)
# 1.保存为csv格式
item_dataframe = pd.DataFrame([item])
#print(item_dataframe)
if k_head==0:
item_dataframe.to_csv(root_dir+'/%d.csv' % product_id,mode='w',header=True,index=False,encoding='gbk')
k_head+=1
else:
item_dataframe.to_csv(root_dir+'/%d.csv' % product_id,mode='a',header=False,index=False,encoding='gbk')
#2.保存成txt
fp = open(root_dir+'/%d.txt' % product_id, 'a', encoding='gbk')
fp.write(string + '\n')
fp.close()
print('%s-page---finish(%s/%s)' % (p,p,maxPage))
else:
return []
p=p+1
if __name__ == '__main__':
phone_id = 100008348542
product_reviews(product_id=phone_id)
三、结果
我们将结果保存到csv文件中,同时也保存了一个字典类型的txt文件。数据都储存在当前新建的文件夹下——京东手机评论_详细字典。

可以看到csv中爬取的数据如上图展示,具体参数包括:
- 评论
- 评论id
- 点赞数
- 手机名称
- 颜色
- 版本
- 用户评分
- 评价时间
- 回复数量
注意,最后八个参数,从中评数开始,一直到最后的默认评论数,都是这一款手机的数据,因此每个csv文件中,最后八个数据是相同的。
四、更多
上述代码只是针对一款手机,若是想要python更多手机的评论,则需要先爬取每一款手机的id,之后循环对id进行遍历即可。
本文是Python爬虫入门教程,讲解如何抓取京东某款手机的用户评论。通过准备商品ID、评论URL和Cookie信息,实现数据爬取,并将结果存储为CSV和TXT文件,包含评论内容、ID、点赞数等详细信息。
6721

被折叠的 条评论
为什么被折叠?



