其实代码都很简单本人编程能力也很一般,且并不是专业做python,只是一个扩展技能,有什么错漏之处请礼貌指出谢谢啦
第一步爬取淘宝评论数据,主要使用request,time
几个要点:
1.header最好给全
2.参数中有两个是动态参数需要根据时间戳进行动态赋值否则会被反爬,我有做了简易的动态UA,无用,还是需要时间戳的动态参数
3.以我本人的能力无法爬取到99页以后的内容,我是使用接口传参的方式去爬的,超过99页以后的页数接口不会报错但是仍然返回99页的数据
4.必须设置sleep,我平时设置10秒或者8秒否则淘宝会弹出反爬的警示框
直接上代码
import requests
import json
import pandas
import time
#获取时间戳
t_param = time.time()
t_list = str(t_param).split('.')
headers = {
'authority': 'rate.tmall.com',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'sec-ch-ua': '^\\^',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
'accept': '*/*',
'sec-fetch-site': 'same-site',
'sec-fetch-mode': 'no-cors',
'sec-fetch-dest': 'script',
'referer': '根据商品信息填写referer',
'accept-language': 'zh-CN,zh;q=0.9',
'cookie': '你的cookie',
}
#一定要加动态参数!
params={
"itemId":"根据url参数获取",
"sellerId":"根据url参数获取",
"currentPage":"1",
"callback":str(int(t_list[1][3:])+1),
"_ksTS":t_list[0]+t_list[1][:3]+"_"+t_list[1][3:]
}
col=['auctionSku','rateContent','rateDate','reply']
auctionSku=[]
rateContent=[]
rateDate=[]
reply=[]
pics=[]
url="https://rate.tmall.com/list_detail_rate.htm"
for page in range(1,100):
params["currentPage"]=str(page)
req=requests.get(url,params,headers=headers).content.decode('utf-8');
result=json.loads(req[req.index('({')+1:-1]);
for item in result['rateDetail']['rateList']:
auctionSku.append(item['auctionSku'])
rateContent.append(item['rateContent'])
rateDate.append(item['rateDate'])
pics.append(item['pics'])
if item['appendComment']:
reply.append(item['appendComment']['content'])
else:
reply.append('')
print('第'+str(page)+'页完毕')
time.sleep(8)
df = pandas.DataFrame({
'产品名字':auctionSku,
'初评':rateContent,
'初评时间':rateDate,
'初评图片':pics,
'追评':reply
})
df.to_excel("1-99.xlsx", sheet_name="评论数据", index=False, header=True)
第二步根据excel表格做数据处理,主要依赖pandas,pyecharts
我的目的是根据评论和追评内容的关键词来判定用户属性,打上标记然后计算标记数量输出成分分析到echarts饼图
注意:我下载的pyecharts插件是v1版本的,但本人实测旧版本更好用,可找到的资料更多,新版本语法很多都修改了,资料少,百度写法时一定要带上V1版本来检索。可惜我的公司电脑环境不知道哪里不对,旧版安装一直失败只能委屈使用新版本。
import pandas
from pyecharts.charts import Pie
from pyecharts import options as opts
tf1 = pandas.read_excel('1-99.xlsx')
tf = tf1.copy()
# # 产品类别筛选
tf = tf1[tf1.iloc[:,0].str.contains('03')|tf1.iloc[:,0].str.contains('16')]
# # 全量标记
tf = tf.copy()
tf.loc[:,'粉丝类别'] = '无法识别'
#
type = {
'cpf':['浪浪钉','^(?=.*?张哲瀚)(?=.*?龚俊).+$',
'山人','lld','LLD','cp','CP','cpf','浪钉','^(?=.*?猫)(?=.*?狗).+$',
'嗑糖','俊哲','端水','橘子皮','俊哲批','份子','张老师','双人','npc','NPC','双代','全城热恋',
'^(?=.*?张)(?=.*?龚).+$','^(?=.*?俊子)(?=.*?公主).+$','^(?=.*?俊子)(?=.*?老婆).+$','^(?=.*?俊俊)(?=.*?老婆).+$',
'^(?=.*?俊俊)(?=.*?lp).+$','^(?=.*?俊俊)(?=.*?哲瀚).+$','^(?=.*?jz)(?=.*?zh).+$',
'^(?=.*?温)(?=.*?周).+$','^(?=.*?老公)(?=.*?老婆).+$','^(?=.*?Zh)(?=.*?gj).+$','^(?=.*?zh)(?=.*?gj).+$',
'^(?=.*?阿絮)(?=.*?老温).+$', '^(?=.*?哲瀚)(?=.*?俊子).+$','^(?=.*?恶龙)(?=.*?公主).+$','^(?=.*?西蒙)(?=.*?公主).+$',
'^(?=.*?老龚)(?=.*?老婆).+$','^(?=.*?星星)(?=.*?月亮).+$','^(?=.*?俊俊)(?=.*?瀚瀚).+$','^(?=.*?星星)(?=.*?月亮).+$',
'^(?=.*?栀子花)(?=.*?柑橘).+$','嗑',
],
'海哲':['海哲','hz','瀚哥','张哲瀚','小哲','hzjj','瀚瀚','哲瀚'],
'俊味仙':['俊味仙','jwx','i俊','俊宝','龚俊','俊俊','俊子'],
}
# cpf
tf.loc[tf.iloc[:,1].str.contains('|'.join(type['cpf']))|tf.iloc[:,4].str.contains('|'.join(type['cpf'])),'粉丝类别']='cpf'
# 俊味仙
tf.loc[(tf.iloc[:,1].str.contains('|'.join(type['俊味仙']))|tf.iloc[:,4].str.contains('|'.join(type['俊味仙'])))&(tf['粉丝类别']!='cpf')&(tf['粉丝类别']!='海哲'),'粉丝类别']='俊味仙'
# 海哲
tf.loc[(tf.iloc[:,1].str.contains('|'.join(type['海哲']))|tf.iloc[:,4].str.contains('|'.join(type['海哲'])))&(tf['粉丝类别']!='cpf')&(tf['粉丝类别']!='俊味仙'),'粉丝类别']='海哲'
keyWords = {
'关键字':[],
'数量':[]
}
for typeItem in ('cpf','海哲','俊味仙'):
for item in type[typeItem]:
keyWords['关键字'].append(item)
if list(tf.iloc[:,1].str.contains(item).value_counts()).__len__()==2:
keyWords['数量'].append(list(tf.iloc[:,1].str.contains(item).value_counts())[1])
else:
keyWords['数量'].append(0)
keyWordsdf =pandas.DataFrame(columns=('关键字','数量'))
keyWordsdf = pandas.DataFrame(keyWords)
keyWordsdf.to_excel('tf关键词结果.xlsx',sheet_name='tf关键词',index=False,header=True)
# 输出到表格
tf.to_excel("tf1-99结果.xlsx", sheet_name="tf", index=False, header=True)
x_data =["cpf", "海哲", "俊味仙", "无法识别"]
y_data = [int(tf[tf['粉丝类别']=='cpf']['粉丝类别'].count()),
int(tf[tf['粉丝类别']=='海哲']['粉丝类别'].count()),
int(tf[tf['粉丝类别']=='俊味仙']['粉丝类别'].count()),
int(tf[tf['粉丝类别']=='无法识别']['粉丝类别'].count())]
#饼图用的数据格式是[(key1,value1),(key2,value2)],所以先使用 zip函数将二者进行组合
data_pair = [list(z) for z in zip(x_data, y_data)]
Pie(init_opts=opts.InitOpts(bg_color="#2c343c")).add(
#系列名称,即该饼图的名称
series_name="粉丝成分",
#系列数据项,格式为[(key1,value1),(key2,value2)]
data_pair=data_pair,
#通过半径区分数据大小 “radius” 和 “area” 两种
rosetype="radius",
#饼图的半径,设置成默认百分比,相对于容器高宽中较小的一项的一半
radius="55%",
#饼图的圆心,第一项是相对于容器的宽度,第二项是相对于容器的高度
center=["50%", "50%"],
#标签配置项
label_opts=opts.LabelOpts(is_show=False, position="center"),
).set_global_opts(
#设置标题
title_opts=opts.TitleOpts(
#名字
title="粉丝成分",
#组件距离容器左侧的位置
pos_left="center",
#组件距离容器上方的像素值
pos_top="20",
#设置标题颜色
title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
),
#图例配置项,参数 是否显示图里组件
legend_opts=opts.LegendOpts(is_show=False),
).set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
),
#设置标签颜色
label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),
).render("粉丝成分.html")