其實代碼都很簡單本人編程能力也很一般品腹,且并不是專業(yè)做python,只是一個擴展技能岖食,有什么錯漏之處請禮貌指出謝謝啦
第一步爬取淘寶評論數(shù)據(jù),主要使用request,time
幾個要點:
1.header最好給全
2.參數(shù)中有兩個是動態(tài)參數(shù)需要根據(jù)時間戳進行動態(tài)賦值否則會被反爬舞吭,我有做了簡易的動態(tài)UA泡垃,無用,還是需要時間戳的動態(tài)參數(shù)
3.以我本人的能力無法爬取到99頁以后的內(nèi)容羡鸥,我是使用接口傳參的方式去爬的蔑穴,超過99頁以后的頁數(shù)接口不會報錯但是仍然返回99頁的數(shù)據(jù)
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': '根據(jù)商品信息填寫referer',
'accept-language': 'zh-CN,zh;q=0.9',
'cookie': '你的cookie',
}
#一定要加動態(tài)參數(shù)!
params={
"itemId":"根據(jù)url參數(shù)獲取",
"sellerId":"根據(jù)url參數(shù)獲取",
"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({
'產(chǎn)品名字':auctionSku,
'初評':rateContent,
'初評時間':rateDate,
'初評圖片':pics,
'追評':reply
})
df.to_excel("1-99.xlsx", sheet_name="評論數(shù)據(jù)", index=False, header=True)
第二步根據(jù)excel表格做數(shù)據(jù)處理惧浴,主要依賴pandas,pyecharts
我的目的是根據(jù)評論和追評內(nèi)容的關鍵詞來判定用戶屬性存和,打上標記然后計算標記數(shù)量輸出成分分析到echarts餅圖
注意:我下載的pyecharts插件是v1版本的,但本人實測舊版本更好用衷旅,可找到的資料更多捐腿,新版本語法很多都修改了,資料少柿顶,百度寫法時一定要帶上V1版本來檢索茄袖。可惜我的公司電腦環(huán)境不知道哪里不對嘁锯,舊版安裝一直失敗只能委屈使用新版本宪祥。
import pandas
from pyecharts.charts import Pie
from pyecharts import options as opts
tf1 = pandas.read_excel('1-99.xlsx')
tf = tf1.copy()
# # 產(chǎn)品類別篩選
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 = {
'關鍵字':[],
'數(shù)量':[]
}
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['數(shù)量'].append(list(tf.iloc[:,1].str.contains(item).value_counts())[1])
else:
keyWords['數(shù)量'].append(0)
keyWordsdf =pandas.DataFrame(columns=('關鍵字','數(shù)量'))
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())]
#餅圖用的數(shù)據(jù)格式是[(key1,value1),(key2,value2)],所以先使用 zip函數(shù)將二者進行組合
data_pair = [list(z) for z in zip(x_data, y_data)]
Pie(init_opts=opts.InitOpts(bg_color="#2c343c")).add(
#系列名稱家乘,即該餅圖的名稱
series_name="粉絲成分",
#系列數(shù)據(jù)項蝗羊,格式為[(key1,value1),(key2,value2)]
data_pair=data_pair,
#通過半徑區(qū)分數(shù)據(jù)大小 “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="粉絲成分",
#組件距離容器左側(cè)的位置
pos_left="center",
#組件距離容器上方的像素值
pos_top="20",
#設置標題顏色
title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
),
#圖例配置項扑馁,參數(shù) 是否顯示圖里組件
legend_opts=opts.LegendOpts(is_show=False),
).set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>涯呻: {c} (rd4ykqx%)"
),
#設置標簽顏色
label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),
).render("粉絲成分.html")