python 爬取天貓美的評論數據


筆者最近迷上了數據挖掘和機器學習,要做數據分析首先得有數據才行。對於我等平民來說,最廉價的獲取數據的方法,應該是用爬蟲在網絡上爬取數據了。本文記錄一下筆者爬取天貓某商品的全過程,淘寶上面的店鋪也是類似的做法,不贅述。主要是分析頁面以及用Python實現簡單方便的抓取。

筆者使用的工具如下

Python 3——極其方便的編程語言。選擇3.x的版本是因為3.x對中文處理更加友好。

Pandas——Python的一個附加庫,用於數據整理。

IE 11——分析頁面請求過程(其他類似的流量監控工具亦可)。

剩下的還有requests,re,這些都是Python自帶的庫。

實例頁面(美的某熱水器):http://detail.tmall.com/item.htm?id=41464129793

評論在哪里?

要抓取評論數據,首先得找到評論究竟在哪里。打開上述網址,然后查看源代碼,發現里面並沒有評論內容!那么,評論數據究竟在哪里呢?原來天貓使用了ajax加密,它會從另外的頁面中讀取評論數據。

這時候IE 11就發揮作用了(當然你也可以使用其他的流量監控工具),使用前,先打開上述網址,待頁面打開后,清除一下IE 11的緩存、歷史文件等,然后按F12,會出現如下界面
F12.png

這時候點擊綠色的三角形按鈕,啟動網絡流量捕獲(或者直接按F5),然后點擊天貓頁面中的“累計評價”:
捕獲.png
出現如下結果
捕獲結果.png
在URL下面出現很多網址,而評論數據正隱藏在其中!我們主要留意類型為“text/html”或者“application/json”的網址,經過測試發現,天貓的評論在下面這個網址之中

http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&spuId=296980116&sellerId=1652490016&order=3&currentPage=1&append=0&content=1&tagId=&posi=&picture=&ua=166UW5TcyMNYQwiAiwVQX1EeUR5RH5Cd0xiNGI%3D%7CUm5Ockt1SHxBe0B0SXNOdCI%3D%7CU2xMHDJxPk82UjVOI1h2VngRd1snQSJEI107F2gFfgRlAmRKakQYeR9zFGoQPmg%2B%7CVGhXd1llXGJfa1ZsV2NeZFljVGlLdUt2TXFOc0tyT3pHe0Z6QHlXAQ%3D%3D%7CVWldfS0SMgo3FysUNBonHyMdNwI4HStHNkVrPWs%3D%7CVmhIGCIWNgsrFykQJAQ6DzQAIBwiGSICOAM2FioULxQ0DjEEUgQ%3D%7CV25OHjAePgA0DCwQKRYsDDgHPAdRBw%3D%3D%7CWGFBET8RMQ04ACAcJR0iAjYDNwtdCw%3D%3D%7CWWBAED5%2BKmIZcBZ6MUwxSmREfUl2VmpSbVR0SHVLcU4YTg%3D%3D%7CWmFBET9aIgwsECoKNxcrFysSL3kv%7CW2BAED5bIw0tESQEOBgkGCEfI3Uj%7CXGVFFTsVNQw2AiIeJxMoCDQIMwg9az0%3D%7CXWZGFjhdJQsrECgINhYqFiwRL3kv%7CXmdHFzkXNws3DS0RLxciAj4BPAY%2BaD4%3D%7CX2ZGFjgWNgo1ASEdIxsjAz8ANQE1YzU%3D%7CQHtbCyVAOBY2Aj4eIwM%2FAToONGI0%7CQXhYCCYIKBMqFzcLMwY%2FHyMdKRItey0%3D%7CQntbCyULKxQgGDgEPQg8HCAZIxoveS8%3D%7CQ3paCiQKKhYoFDQIMggwEC8SJh8idCI%3D%7CRH1dDSMNLRIrFTUJMw82FikWKxUueC4%3D%7CRX5eDiAOLhItEzMOLhIuFy4VKH4o%7CRn5eDiAOLn5GeEdnW2VeYjQUKQknCSkQKRIrFyN1Iw%3D%3D%7CR35Dfl5jQ3xcYFllRXtDeVlgQHxBYVV1QGBfZUV6QWFZeUZ%2FX2FBfl5hXX1AYEF9XXxDY0J8XGBbe0IU&isg=B2E8ACFC7C2F2CB185668041148A7DAA&_ksTS=1430908138129_1993&callback=jsonp1994

是不是感覺長到暈了?不要緊,只需要稍加分析,就發現可以精簡為以下部分

http://rate.tmall.com/list_detail_rate.htm?itemId= 41464129793&sellerId= 1652490016&currentPage= 1

我們發現天貓還是很慷慨的,評論頁面的地址是很有規律的(像京東就完全沒規律了,隨機生成。),其中itemId是商品id,sellerid是賣家id,currentPage是頁面號。

怎么爬取?

費了一番周折,終於找到評論在哪里了,接下來是爬取,怎么爬取呢?首先分析一下頁面規律。
頁面格式.png

我們發現頁面數據是很規范的,事實上,它是一種被稱為JSON的輕量級數據交換格式(大家可以搜索JSON),但它又不是通常的JSON,事實上,頁面中的方括號[]里邊的內容,才是一個正確的JSON規范文本。

下面開始我們的爬取,我使用Python中的requests庫進行抓取,在Python中依次輸入:

import requests as rq url='http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&sellerId=1652490016¤tPage=1' myweb = rq.get(url)

現在該頁面的內容已經保存在myweb變量中了,我們可以用myweb.text查看文本內容。

接下來就是只保留方括號里邊的部分,這需要用到正則表達式了,涉及到的模塊有re。

import re myjson = re.findall('\"rateList\":(\[.*?\])\,\"tags\"',myweb.text)[0]

呃,這句代碼什么意思?懂Python的讀者大概都能讀懂它,不懂的話,請先閱讀一下相關的正則表達式的教程。上面的意思是,在文本中查找下面標簽

"rateList": [...],"tags"

找到后保留方括號及方括號里邊的內容。為什么不直接以方括號為標簽呢,而要多加幾個字符?這是為了防止用戶評論中出現方括號而導致抓取出錯。

現在抓取到了myjson,這是一個標准的JSON文本了,怎么讀取JSON?也簡單,直接用Pandas吧。這是Python中強大的數據分析工具,用它可以直接讀取JSON。當然,如果僅僅是為了讀取JSON,完全沒必要用它,但是我們還要考慮把同一個商品的每個評論頁的數據都合並成一個表,並進行預處理等,這時候Pandas就非常方便了。

import pandas as pd mytable = pd.read_json(myjson)

現在mytable就是一個規范的Pandas的DataFrame了:
mytable1.png
mytable2.png
如果有兩個表mytable1和mytable2需要合並,則只要

pd.concat([mytable1, mytable2], ignore_index=True)

等等。更多的操作請參考Pandas的教程。

最后,要把評論保存為txt或者Excel(由於存在中文編碼問題,保存為txt可能出錯,因此不妨保存為Excel,Pandas也能夠讀取Excel文件)


mytable.to_csv('mytable.txt') mytable.to_excel('mytable.xls') 

一點點結論

讓我們看看一共用了幾行代碼?

import requests as rq import re import pandas as pd url='http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&sellerId=1652490016¤tPage=1' myweb = rq.get(url) myjson = re.findall('\"rateList\":(\[.*?\])\,\"tags\"',myweb.text)[0] mytable = pd.read_json(myjson) mytable.to_csv('mytable.txt') mytable.to_excel('mytable.xls') 

九行!十行不到,我們就完成了一個簡單的爬蟲程序,並且能夠爬取到天貓上的數據了!是不是躍躍欲試了?

當然,這只是一個簡單的示例文件。要想實用,還要加入一些功能,比如找出評論共有多少頁,逐頁讀取評論。另外,批量獲取商品id也是要實現的。這些要靠大家自由發揮了,都不是困難的問題,本文只希望起到拋磚引玉的作用,為需要爬取數據的讀者提供一個最簡單的指引。

其中最困難的問題,應該是大量采集之后,有可能被天貓本身的系統發現,然后要你輸入驗證碼才能繼續訪問的情況,這就復雜得多了,解決的方案有使用代理、使用更大的采集時間間隔或者直接OCR系統識別驗證碼等等,筆者也沒有很好的解決辦法。


轉載到請包括本文地址:http://spaces.ac.cn/archives/3298/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM