Python爬取淘宝评论并生成词云
推荐使用Anaconda,其使用十分方便、快捷。
- requests库
- json库
- pandas库
- xlwt库
- jieba分词库
- matplotlib绘图(要先安装pandas库)
- wordcloud词云库
注意事项
- 目前淘宝只支持查看前100页评论,但对于新手来说,用来进行数据分析以经足够了;
- 由于淘宝有较强的反扒机制,需使用登录后的网址。对于高手来讲,可以使用代理池等操作,本篇文章只是用了Cookie来保证爬取顺利;
- 在实际操作时,要文明操作,不要给他人服务器造成影响;
- 本篇博客相关数据均没有涉及个人秘密及隐私;
- 此篇博客仅供学习使用。若另作他用,后果与本博客无关。
话不多说,直接上代码
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 14 18:32:34 2020
@author: 梧桐*漂湘
"""
#导入相关库
import requests
#import time //读者可以应用此库合理限制爬取频率
import json
import pandas as pd
import xlwt
#做出词云所需库
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
"""
------------------------------------------------------------------------------
STEP01 评论爬取
------------------------------------------------------------------------------
"""
#获取网页的html源码
def get_html(url):
header={
'accept':'*/*',
'accept-language':'zh-CN,zh;q=0.9',
'connection':'keep-alive',
#示例 :'referer':'https://detail.tmall.com/item.htm?id=61347770226421&ali_refid=a3_43067223_1006:1105370874:N:lVpUfc1IrSs2DXwEZqoGNw==:d1bb9be356b2df02eebf0d3b54be7d355713&ali_trackid=1_d1bb9b56b2df3402eebf0d3b54be7d3713&spm=a2e0b.20234350158.31919782.1&sku_properties=5919063:6536340215',
#XXXX处请根据实际情况填写
'referer':'https://detail.tmall.com/item.htm?id=XXXXXX&ali_refid=XXXXXX&ali_trackid=XXXXXX&spm=XXXXXX&sku_properties=XXXXXX',
'cookie': '你的cookie',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
response=requests.get(url,headers=header)
response.content.decode("UTF-8")
html=response.text
return html
def getJson(url):
#woc,返回的JSON变了,必须replace('jsonp128',''),同时b=d['rateList']要改为b=d['rateDetail']['rateList']
data=get_html(url).replace('jsonp128','').strip().strip("()")
d=json.loads(data,strict=False)
b=d['rateDetail']['rateList'] #得到rateList后面的[]即列表类型,[]里有多个{}信息,每个{}代表一个用户的评论信息
print(type(b[0])) #列表[]里的每一个元素又是一个字典类型的数据
#下面遍历列表元素,取出每一个列表元素中字典里的特定信息:content、nick、date
print(type(b))
elem_list=[]
for elem in b:
user=elem['displayUserNick'] #用户名
date=elem['rateDate'] #日期
xh=elem['cmsSource'] #平台
kinds=elem['auctionSku'] #商品类型
comt=elem['rateContent'] #评论内容
elem_list.append(user)
elem_list.append(date)
elem_list.append(xh)
elem_list.append(kinds)
elem_list.append(comt)
return elem_list
print(b['rateDate'])
def writeAll(num):
#示例:first="https://rate.tmall.com/list_detail_rate.htm?itemId=613477706421&spuId=1526571124&sellerId=1646247574&order=3¤tPage="
#XXXX处请根据实际情况填写
first="https://rate.tmall.com/list_detail_rate.htm?itemId=XXXXXX&spuId=XXXXXX&sellerId=XXXXXX&order=XXXXXX¤tPage="
path="评论.xls"
column=0 #列
count=0
file=xlwt.Workbook()
sheet1=file.add_sheet('1')
elem_list=[]
elem_list.append("用户")
elem_list.append("日期")
elem_list.append("平台")
elem_list.append("类型")
elem_list.append("评论")
for index in range(len(elem_list)):
sheet1.write(0,index,elem_list[index])
#大家都知道xlwt库每次写入excel会覆盖之前的内容,对此通过以下方法避免
#也可以使用其他更为方便的方法
row=1
for n in range(1,num+1): #实现爬取评论时翻页
try:
url=first+str(n)+"&append=0&content=1"
print(url)
infor=getJson(url)
t=len(infor)
if(t==0):
return
for j in range(t):
sheet1.write(row,column,infor[j])
count=count+1 #计数器
column=column+1 # 写入excel时自动换列
if(count%5==0): #由elem_list内的列数决定
row=row+1 # 写完excel同行的每列时自动换行
column=0
file.save(path)
print("第"+str(n)+"页获取成功!")
except:
print("has error")
continue
#XXXX处请根据实际情况填写
#示例:url="https://rate.tmall.com/list_detail_rate.htm?itemId=613477706421&spuId=1526571124&sellerId=1646247574&order=3¤tPage=4&append=0&content=1"
url="https://rate.tmall.com/list_detail_rate.htm?itemId=XXXXXX&spuId=XXXXXX&sellerId=XXXXXX&order=XXXXXX¤tPage=XXXXXX&append=XXXXXX&content=XXXXXX"
html=get_html(url)
#print(html)
writeAll(你要爬取的页数) #爬取的评论页数,请自定,<=100即可
"""
------------------------------------------------------------------------------
STEP02 简单去重
------------------------------------------------------------------------------
"""
#抽取评论,方便去重操作
inputfile0="评论.xls"
outputfile0="评论.txt"
data0=pd.read_excel(inputfile0)
data0=data0[[u'评论']][data0[u'平台']==u'天猫'] #只处理评论列
data0.to_csv(outputfile0,index=False,header=False)
#简单地去重,便于做出词云时提高准确性
inputfile1="评论.txt"
outputfile1="去重评论.txt"
data1=pd.read_csv(inputfile1,encoding='utf-8',header=None)
l1=len(data1)
data1=pd.DataFrame(data1[0].unique())
l2=len(data1)
data1.to_csv(outputfile1,index=False,header=False,encoding='utf-8')
print(u'总计删除了%s条评论。'%(l1-l2))
"""
------------------------------------------------------------------------------
STEP03 制作词云
------------------------------------------------------------------------------
"""
#做出评论词云
with open("去重评论.txt",'r',encoding="utf-8") as f:
text=f.read()
# print(text)
text = ' '.join(jieba.cut(text,cut_all=True))
# print(text)
backgroud_Image = plt.imread('apple.jpg') # 词云底图地址
wordcloud = WordCloud( #注意逗号封尾
background_color = 'black', # 设置词云背景颜色
mask = backgroud_Image,
max_words = 2000, # 设置词云最大现实的字数
stopwords = STOPWORDS, # 设置词云停用词
font_path='C:\Windows\Fonts\simsun.ttc',
max_font_size=70, # 设置词云字体最大值
min_font_size=5, # 设置词云字体最小值
random_state=42,
scale=2,
).generate(text)
image_colors = ImageColorGenerator(backgroud_Image)
plt.imshow(wordcloud.recolor(color_func=image_colors))
plt.imshow(wordcloud)
plt.axis("off")
fig=plt.gcf()
fig.set_size_inches(20,20) #设置产生词云图片的大小
plt.show()
首先点击商品页面的 “累计评价” ,然后按照下图操作即可:
爬取部分数据展示
所需底图
爬取数据、成果展示
- Excel展示
- 数据简单处理结果
- 词云展示
注:从词云可以看出jieba分词的弊端:“运行速度”被分成了“运行”、“行速”和“速度”,哈哈哈哈…
声明
由于淘宝可能随时更新相关网页参数,可能有细节需各位做出调整。希望这篇博客能帮到各位,不喜勿喷,谢谢!