Python入门--爬取淘宝评论并生成词云

Python爬取淘宝评论并生成词云

所需相关Python第三方库(目前最新版本即可)

推荐使用Anaconda,其使用十分方便、快捷。

  1. requests库
  2. json库
  3. pandas库
  4. xlwt库
  5. jieba分词库
  6. matplotlib绘图(要先安装pandas库)
  7. wordcloud词云库

注意事项

  1. 目前淘宝只支持查看前100页评论,但对于新手来说,用来进行数据分析以经足够了;
  2. 由于淘宝有较强的反扒机制,需使用登录后的网址。对于高手来讲,可以使用代理池等操作,本篇文章只是用了Cookie来保证爬取顺利;
  3. 在实际操作时,要文明操作,不要给他人服务器造成影响;
  4. 本篇博客相关数据均没有涉及个人秘密及隐私;
  5. 此篇博客仅供学习使用。若另作他用,后果与本博客无关。

话不多说,直接上代码

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 27 21:24:56 2019

@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


#获取网页的html源码
def get_html(url):
    header={               #以下内容请依据你的实际情况填写
        'accept':'*/*',
        'accept-language':'zh-CN,zh;q=0.9',
        'connection':'keep-alive',
        'referer':              #此处填写你要爬取页面的referer连接,注意header中除最后一行外,要用","英文逗号结尾#,
        'cookie':              #此处填写你要爬取页面请求的cookie,注意header中除最后一行外,要用","英文逗号结尾#,
        'user-agent':        #此处填写你要爬取页面的user-agent,注意header中最后一行,不要用任何符号结尾#
        }
    
    response=requests.get(url,headers=header)
    response.encoding=response.apparent_encoding
    html=response.text
    return html

def getJson(url):
    data=get_html(url).strip().strip('()')
    d=json.loads(data)
    b=d['rateList']                   #得到rateList后面的[]即列表类型,[]里有多个{}信息,每个{}代表一个用户的评论信息
    print(type(b[0]))               #列表[]里的每一个元素又是一个字典类型的数据
#下面遍历列表元素,取出每一个列表元素中字典里的特定信息
    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=XXXX&spuId=XXXX&sellerId=XXXX&order=XXXX¤tPage="          #XXXX处请根据实际情况填写
    path="你所要存储爬取数据的excel文件,注意为.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)
            
        except:
            print("has error")
            continue     
    print("第”+str(n)+"页获取成功!")

    
url="https://rate.tmall.com/list_detail_rate.htm?itemId=XXXX&spuId=XXXX&sellerId=XXXX&order=XXXX¤tPage=1&append=XXXX&content=XXXX"
#XXXX处请根据实际情况填写,¤tPage=1表示从第一页开始爬取
html=get_html(url)
print(html)
writeAll(6)                                          #爬取的评论页数,请自定,<=100即可

#抽取评论,方便去重操作
inputfile0="你所存储爬取数据的excel文件,为.xls后缀"
outputfile0="你所存储所提取的评论的.txt文件,为.txt后缀"
data0=pd.read_excel(inputfile0)
data0=data0[[u'评论']][data0[u'平台']==u'天猫']               #只处理评论列
data0.to_csv(outputfile0,index=False,header=False)

#简单地去重,便于做出词云时提高准确性
inputfile1="你所存储所提取的评论的.txt文件,为.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))

#做出评论词云
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('底图图片存储地址')
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()

爬取部分数据展示

所需底图

Python入门--爬取淘宝评论并生成词云_第1张图片

爬取数据、成果展示

  1. Excel展示
    Python入门--爬取淘宝评论并生成词云_第2张图片Python入门--爬取淘宝评论并生成词云_第3张图片
  2. 数据简单处理结果
    Python入门--爬取淘宝评论并生成词云_第4张图片
  3. 词云展示
    Python入门--爬取淘宝评论并生成词云_第5张图片
    注:从词云可以看出jieba分词的弊端:“运行速度”被分成了“运行”、“行速”和“速度”,哈哈哈哈…

声明

由于淘宝可能随时更新相关网页参数,可能有细节需各位做出调整。希望这篇博客能帮到各位,不喜勿喷,谢谢!

你可能感兴趣的:(Python)