通過Python抓取天貓評論資料
接著點進去後,發現有非常多的歷史累計評價,於是我一條條的檢視,一頁頁的翻,覺得口碑還是非常不錯的,於是選擇這款商品。我想大家可能也是這樣的購物模式,也許還可能更加複雜(貨比三家,口碑比較,聯絡賣家......)。
如果有一天,我想研究這些個評論資料,然後玩玩高大上的自然語言處理,我是不是該把這些評論複製下來拷貝到一張大表裡呢?雖然可以這麼做,但總覺得效率有點低(相比於爬蟲不是低一兩個量級哦~)。如果你會爬蟲的話,你就會感受到自動化給你帶來的興奮,接下來我們就研究研究如何使用Python對天貓的評論資料進行抓取。
按照常規出牌,發現然並軟。。。。
一般常規是這樣進行的,在上面的評論頁中,右擊選擇“檢視網頁原始碼”,於是程式碼是長這樣的:
我想搜一下原始網頁中有一條評論“很好,高階划算的”這句話在原始碼的什麼位置,非常不幸的是,當我按下Ctrl+F,並輸入“很好”,盡然沒有這樣的字眼。。。難不成我抓不了天貓網站的評論資料了?No,方法還是有的,只不過不能出常規牌了,因為天貓的評論資料是非同步儲存在其他地方的。
非常規方法,兩眼發光!
在評論頁面,我們按一下F12(我用的是Chrom瀏覽器)那個鍵,於是出現了這個:
也許你的頁面佈局是上下兩部分,而且下半部分什麼也沒有,這個時候你需要做兩件事:1,選擇Network底下的JS部分,因為天貓的評論資料是非同步儲存在一個JS連線裡面的;2,重新整理頁面,找到一個叫“list_detail_rate“開頭是檔案。當你開啟這個檔案後,它是長成這樣的:
你會發現有一個請求連線,接下來你只需要將這個連結複製下來,並在瀏覽器中貼上這個地址,你就會發現,原來這些評論隱藏在這個地方啊。。。
哈哈,接下來我們就可以通過正則表示式,把類似於紅框中的資訊抓取下來(使用者暱稱,評論時間,購買的套餐,衣服尺寸,評論內容)。你可能還會問一個問題,你這個頁面裡也只是裝的一頁的評論資訊,如何把所有頁面的評論資訊全部抓下來呢?我們發現一個規律,那個複製下來的連線可以總結為這種形式:https://rate.tmall.com/list_detail_rate.htm?itemId=521136254098&spuId=345965243&sellerId=2106525799&order=1¤tPage=1
爬蟲知識:
requests模組:
get方法向對方伺服器傳送一個url請求;
text方法可以將get請求的迴應轉換為文字的字串格式;
re模組:
findall函數借助於正則表示式在文字中尋找所有匹配的結果,語法格式:
findall(pattern,string,flags)
pattern接受一個正則表示式物件;
string接受一個需要處理的字串;
flags接受一個模式引數,如是否忽略大小寫(flags = re.I);
上菜:
# 匯入所需的開發模組
import requests
import re
# 建立迴圈連結
urls = []
fori in list(range(1,100)):
urls.append('https://rate.tmall.com/list_detail_rate.htm?itemId=521136254098&spuId=345965243&sellerId=2106525799&order=1¤tPage=%s'%i)
# 構建欄位容器
nickname = []
ratedate = []
color = []
size = []
ratecontent = []
# 迴圈抓取資料
forurl in urls:
content = requests.get(url).text
# 藉助正則表示式使用findall進行匹配查詢
nickname.extend(re.findall('"displayUserNick":"(.*?)"',content))
color.extend(re.findall(re.compile('顏色分類:(.*?);'),content))
size.extend(re.findall(re.compile('尺碼:(.*?);'),content))
ratecontent.extend(re.findall(re.compile('"rateContent":"(.*?)","rateDate"'),content))
ratedate.extend(re.findall(re.compile('"rateDate":"(.*?)","reply"'),content))
print(nickname,color)
# 寫入資料
file =open('南極人天貓評價.csv','w')
fori in list(range(0,len(nickname))):
file.write(','.join((nickname[i],ratedate[i],color[i],size[i],ratecontent[i]))+'\n')
file.close()
最終呈現的爬蟲結果如下:
今天的爬蟲部分就介紹到這裡,本次的分享目的是如何解決網頁資訊的非同步儲存。在之後的分享中我將針對這次爬取的評論資料進行文字分析,涉及到切詞、情感分析、詞雲等。