最近新換了臺手機,因此想用爬蟲看看淘寶上相關的評價。
Python爬取簡單頁面還是比較套路的,要么直接爬取HTML頁面,要么爬取對應的json頁面,當然這里不考慮驗證碼需要登錄等情況。淘寶的頁面數據是異步加載的,所以要到相應的json文件里找對應的數據,評論數據都是裝載在json里再經過JavaScript處理后顯示到HTML頁面里的。下面我們來實戰一下華為榮耀暢玩7C這款手機在天貓旗艦店的評價,在淘寶上搜索榮耀暢玩7C定位到官方頁面,之后按F12打開源碼,定位到Network,因為默認F12的開發者選項的頁面是對應Elements的,按F5刷新頁面后在Network里對應找到相關的json文件,實際爬過一些小項目的人應該很熟悉上面的操作了。如下圖:
找到json數據位置
點擊Headers可以看到對應的URL和請求方式(是get還是post)
Headers頁面.png
可以看到URL很長,里面封裝了大量的參數,用這個url可以爬取評論的單個頁面,但是要連續爬取各個頁面的評論挺困難的,我研究了很久試了很多次callback參數的改變,效果不是很好,后來查網上的資料發現可以簡化參數,將后面的參數削減掉,只保留幾個必要的參數,變成:https://rate.taobao.com/feedRateList.htm?auctionNumId=商品id¤tPageNum=1,改變currentPageNum就好,于是開始完善代碼,用requests獲得數據后,用json將str類型的數據變成json數據,然后解析json數據,提取評論中自己關注的數據寫入csv文件中,這里懶得用csv庫了,直接當做文本文件進行讀寫。代碼如下:
import requests
import json
import re
def getOneUrl(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return -1 # 頁面沒正常下下來
首先是比較套路的獲取單個頁面數據,就是調用了 requests.get(url)
def getOverViewComment():#評論概覽
oc_url = "https://rate.tmall.com/listTagClouds.htm?" \
"itemId=565264660443&isAll=true&isInner=true"
ovtxt=getOneUrl(oc_url)
print(ovtxt)
#jsonp921({"tags":{"dimenSum":8,…… loudList":""}})
if ovtxt==-1:
return
#ov2=re.compile('\{.+\}').search(ovtxt) #json的部分
ovc = json.loads('{'+ovtxt+'}')
print(ovc["tags"]["rateSum"])
for tc in ovc['tags']['tagClouds']:
print(tc['tag'],tc)
函數getOverViewComment()是獲取榮耀暢玩7C的評論概覽數據,對應HTML里的效果如下:
HTML里的整體評論
getOverViewComment()運行的輸出如下
暢玩7C評論概覽
下面的代碼功能是獲取和解析每個頁面的評論數據,具體代碼不難理解的。
def parseCommentJson(url, savep): # 解析每個頁面的json數據
text = getOneUrl(url)
if text == -1:
print('頁面沒正常獲取', url)
return -1
hc = json.loads(text.strip().strip('()')) # 除掉空格和首尾括號
if (hc['total'] == 0 or hc['comments'] == None):
return 0
print(hc['total'])
with open(savep, 'a+', encoding='utf-8') as wf:
for each_c in hc['comments']: #循環每條評論
wstr = '{name},{date},{ct},{sku}'.format(name=each_c['user']['nick'],
date=each_c['date'], ct=each_c['content'],
sku=each_c['auction']['sku'])
aplst = each_c['appendList']
addstr = ''
if aplst != []: # 有追評
for adict in aplst:
astr = ',{dac},{act}'.format(dac=str(adict['dayAfterConfirm']), act=adict['content'])
addstr = addstr+astr
wf.write(wstr+addstr+'\n')
def honorComment():
for i in range(1,101):#結束頁面可以自由改,如果要全量爬就設大一些,每個頁面大概有20條 30115/20
url='https://rate.taobao.com/feedRateList.htm?auctionNumId={cid}&' \
'currentPageNum={page}'.format(cid='565264660443',page=str(i))
savep='D:/FFOutput/honor7cComment_{page}.csv'.format(page=str(i)) #直接page=i 也是可以的
#page不迭代時,是寫到同一個文件里,省得去合并了
if (parseCommentJson(url,savep)==0):
break #后面沒有評論了
honorComment() #調用
代碼也可以進行拓展,例如獲取評論里的其他屬性,我這里主要爬了用戶名稱、評價時間、評價內容、購買類型以及追評的數據。需要其他數據可以自己改一下代碼,并不難。
最后的數據效果如下,我只爬了前100頁的數據。
評論數據輸出.csv
有這樣的幾千條數據可以進行一些有趣的分析,例如每天的評價數:評價數隨時間變化的折線圖、結合促銷手段、其他手機的發布時間等數據去理解評價數隨時間的變化,分析榮耀10發布是否對榮耀暢玩7C的銷量有影響;各種類型售出的比例:大家是更喜歡3G內存版本還是4G內存版本,大家更喜歡哪種顏色;對于核心的評論文本,可以結合自然語言處理進行深入分析,例如情感分析,對有追評數據的分析前后的情感變化,做詞云圖進行可視化等等。之后也許會把分析過程也用Python實現然后寫成文章。
上面的分析過程和爬蟲代碼是一個框架,想要分析其他產品的淘寶評論也可以按照這個思路。如果有其他有趣的分析視角,歡迎留言。