1. 程式人生 > >通過Python抓取天貓評論資料

通過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

,可以每次更換最後的currentPage值就可以抓取出不同頁的評論資訊了。

爬蟲知識:

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()

最終呈現的爬蟲結果如下:

今天的爬蟲部分就介紹到這裡,本次的分享目的是如何解決網頁資訊的非同步儲存。在之後的分享中我將針對這次爬取的評論資料進行文字分析,涉及到切詞、情感分析、詞雲等。