筆者最近迷上了資料探勘和機器學習,要做資料分析首先得有資料才行。對於我等平民來說,最廉價的獲取資料的方法,應該是用爬蟲在網路上爬取資料了。本文記錄一下筆者爬取天貓某商品的全過程,淘寶上面的店鋪也是類似的做法,不贅述。主要是分析頁面以及用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中依次輸入:

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

現在該頁面的內容已經儲存在myweb變數中了,我們可以用myweb.text檢視文字內容。

接下來就是隻保留方括號裡邊的部分,這需要用到正規表示式了,涉及到的模組有re。

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

呃,這句程式碼什麼意思?懂Python的讀者大概都能讀懂它,不懂的話,請先閱讀一下相關的正規表示式的教程。上面的意思是,在文字中查詢下面標籤

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

找到後保留方括號及方括號裡邊的內容。為什麼不直接以方括號為標籤呢,而要多加幾個字元?這是為了防止使用者評論中出現方括號而導致抓取出錯。

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

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

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

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

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

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

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

一點點結論

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

1
2
3
4
5
6
7
8
9
import requests as rq
import re
import pandas as pd
url='http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&sellerId=1652490016&currentPage=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/

如果您覺得本文還不錯,歡迎點選下面的按鈕對博主進行打賞。打賞並非要從中獲得收益,而是希望知道有多少人曾在科學空間駐足。當然,如果你無視它,也不會影響你的閱讀。再次表示歡迎和感謝!