要抓壹個網頁,首先自然是要“研究”這個網頁。通常我會用兩種方式:
壹個是 Chrome 的 Developer Tools。通過它裏面的 Network 功能可以看到頁面發出的所有網絡請求,而大多數數據請求都會在 XHR 標簽下。點擊某壹個請求,可以看到其具體信息,以及服務器的返回結果。很多網站在對於某些數據會有專門的請求接口,返回壹組 json 或者 XML 格式的數據,供前臺處理後顯示。
Step.2 獲取頁面
分析完畢,開抓。
直接 urllib.urlopen 向目標網頁發送請求,讀出網頁。結果,失敗了……
看了下返回結果:
403 Forbidden
You don't have permission to access the URL on this server. Sorry for the inconvenience.
被拒了,所以這種赤裸裸地請求是不行的。沒關系,那就稍微包裝壹下:
send_headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection':'keep-alive',
'Host':'xueqiu.com',
'Cookie':r'xxxxxx',
}
req = urllib2.Request(url, headers=send_headers)
resp = urllib2.urlopen(req)
html = resp.read()
header 數據都可以從 Developer Tools 裏拿到。這次順利抓到頁面內容。
壹般網站或多或少都會對請求來源做壹些阻攔,通過加 header 可以搞定大部分情況。
Step.3 提取數據
因為這個數據比較明顯,直接用通過壹些字符串查找和截取操作就可以取出來。
pos_start = html.find('SNB.cubeInfo = ') + len('SNB.cubeInfo = ')
pos_end = html.find('SNB.cubePieData')
data = html[pos_start:pos_end]
dic = json.loads(data)
dic 就是壹個包含數據的字典對象。之後想幹什麽就隨便妳了。
對於復雜壹點的情況,可以通過 BeautifulSoup 來定位 html 標簽。再不好辦的,就用正則表達式,基本都可以解決掉。
Step.4 處理數據
因為我想對數據進行持久化存儲,並且做展示和分析,所以我用了 django 裏的 ORM 來處理抓下來的數據。
# add Portfolio
portfolio, c = models.Portfolio.objects.get_or_create(code=dic['symbol'])
portfolio.name = dic['name']
portfolio.earnings = dic['total_gain']
portfolio.save()
# add Stock
stocks = dic['view_rebalancing']['holdings']
for s in stocks:
stock, c = models.Stock.objects.get_or_create(code=s['stock_symbol'])
stock.name = s['stock_name']
stock.count += 1
stock.weight += s['weight']
stock.save()
Portfolio 記錄下組合及其收益,Stock則記錄每支股票的被收錄數和總收錄份額。
對於抓取到的,壹般也可以存在文件中,或者直接通過 SQL 存入數據庫,視不同情況和個人喜好而定。
Step.5 批量抓取
前面的壹套做下來,就完整地抓取了壹組數據。要達到目的,還要設計壹下批量抓取的程序。
壹個要解決的問題就是如何獲得組合列表。這個可以再通過另壹個抓取程序來實現。然後根據這些列表來循環抓取就可以了。
若要細究,還要考慮列表如何保存和使用,如何處理抓取失敗和重復抓取,如何控制抓取頻率防止被封,可否並行抓取等等。
Step.6 數據分析
數據有了,妳要怎麽用它,這是個很大的問題。可以簡單的統計現象,也可以想辦法深入分析背後隱藏的邏輯。不多說,我也還只是在摸索之中。