筆者最近迷上了數據挖掘和機器學習,要作數據分析首先得有數據才行。對於我等平民來講,最廉價的獲取數據的方法,應該是用爬蟲在網絡上爬取數據了。本文記錄一下筆者爬取天貓某商品的全過程,淘寶上面的店鋪也是相似的作法,不贅述。主要是分析頁面以及用Python實現簡單方便的抓取。html
筆者使用的工具以下python
Python 3——極其方便的編程語言。選擇3.x的版本是由於3.x對中文處理更加友好。web
Pandas——Python的一個附加庫,用於數據整理。ajax
IE 11——分析頁面請求過程(其餘相似的流量監控工具亦可)。正則表達式
剩下的還有requests,re,這些都是Python自帶的庫。編程
實例頁面(美的某熱水器):http://detail.tmall.com/item.htm?id=41464129793json
要抓取評論數據,首先得找到評論究竟在哪裏。打開上述網址,而後查看源代碼,發現裏面並無評論內容!那麼,評論數據究竟在哪裏呢?原來天貓使用了ajax加密,它會從另外的頁面中讀取評論數據。緩存
這時候IE 11就發揮做用了(固然你也可使用其餘的流量監控工具),使用前,先打開上述網址,待頁面打開後,清除一下IE 11的緩存、歷史文件等,而後按F12,會出現以下界面網絡
這時候點擊綠色的三角形按鈕,啓動網絡流量捕獲(或者直接按F5),而後點擊天貓頁面中的「累計評價」:
出現以下結果
在URL下面出現不少網址,而評論數據正隱藏在其中!咱們主要留意類型爲「text/html」或者「application/json」的網址,通過測試發現,天貓的評論在下面這個網址之中app
http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&spuId=296980116&sellerId=1652490016&order=3¤tPage=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¤tPage= 1
咱們發現天貓仍是很慷慨的,評論頁面的地址是頗有規律的(像京東就徹底沒規律了,隨機生成。),其中itemId是商品id,sellerid是賣家id,currentPage是頁面號。
費了一番周折,終於找到評論在哪裏了,接下來是爬取,怎麼爬取呢?首先分析一下頁面規律。
咱們發現頁面數據是很規範的,事實上,它是一種被稱爲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和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/