pyspider爬取王者榮耀數(shù)據(jù)(上)
咪哥雜談

本篇閱讀時間約為 8 分鐘。
1
前言
不知道還有多少人記得幾個月前寫的兩篇文章,介紹關于 PyQuery 入門使用的教程。忘記的朋友,可以去回顧下用法:
爬蟲神器之PyQuery實用教程(二),50行代碼爬取窮游網(wǎng)
在之前的某一期文章下面,我記得有過一次留言,說是要安排一下王者榮耀的數(shù)據(jù)爬取,并且是使用 PySpider 爬蟲框架。
那么,今天就帶來一篇關于?pyspider 的入門教程。
題外話:
對于王者榮耀這種電競類游戲來說,為什么有些人能輕松上王者?而有些人卻一直停留在低段位?無非就是沒有了解過規(guī)則,以及其背后的數(shù)據(jù)罷了。
一款游戲,對于數(shù)據(jù)和規(guī)則熟知于心,那么,上分是輕輕松松的事兒。
作為一個電競游戲從初中開始玩的人來說,從 dota1 到 lol,再到后來的 dota2,最后到移動端的王者榮耀,每次都是將數(shù)據(jù)與規(guī)則了解后,才得心應手的去上分。
放上我的王者榮耀段位圖,秀一波
:


~可以一起排位。下面進入正題。今天這篇,爬取的網(wǎng)站數(shù)據(jù)包括技能,英雄屬性數(shù)值,推薦裝備等。
2
準備工作
1. 什么是?pyspider

pyspider是一款優(yōu)秀的框架,并配有 WebUI 的界面。
平時我們寫爬蟲時,只能是自己從零開始不斷地搭建代碼,但是有沒有發(fā)現(xiàn),當你寫了很多爬蟲的時候,有些邏輯無非就是在修改獲取節(jié)點元素的規(guī)則,其它代碼是不用做修改的。
這樣一來,每次都要重復的去寫一些相同的代碼,不僅枯燥,且浪費時間。在這樣的場景下,框架才會誕生出來。
只需要你對變化的東西進行“填充”即可,其余相同的地方,框架幫你做。
對于框架來說,學習成本也各不相同,比如知名的爬蟲框架 scrapy ,相對于新手來說,可能難度就大一些。?
而 pyspider 自帶了一個頁面,可以實時調(diào)試,對于初學者來說,上手容易,腳本編寫規(guī)則也非常簡單。
介紹就到此結(jié)束了。
3
確定爬取目標
先來看下王者榮耀第三方網(wǎng)站首頁:
http://db.18183.com/wzry/
18183王者榮耀




紅框即爬取目標,整理一下,具體有:
- 每個英雄簡介
- 技能介紹描述
- 推薦技能加點
- 英雄出裝建議
- 英雄屬性數(shù)值
4
pyspider入門
1. 安裝 pyspider 庫
開始介紹入門之前,先來安裝下它。
pip install pyspider
啟動后,打開瀏覽器,輸入 http://localhost:5000?,可以看到下圖:

3. 創(chuàng)建任務
點擊 create 按鈕,創(chuàng)建新工程任務。name 隨意寫,start url 寫我們要爬取的首頁即可。

4. 自動生成代碼


Handler類里有 3 個方法,分別是 on_start,index_page,detail_page 方法,每個方法上面有著自己的裝飾器。
- on_start():啟動后進入的第一個方法,主 url 在此處被請求,響應會傳入 callback 后面的 index_page 函數(shù)中。
- index_page():主 url 返回的響應源碼進入到此函數(shù)到 response 里,其中 reponse.doc 用到了 PyQuery 語法,用來匹配你想要的信息節(jié)點,繼續(xù)傳入到下一個詳情頁中。
- detail_page():處理最后的具體邏輯,當然你也可以繼續(xù)類似上面的回調(diào),主要看你要抓取的信息到底在多少層的頁面中。
分析下王者榮耀的官網(wǎng),我們需要的信息:

以下,首頁到魯班大師詳情頁為例:



點擊運行后的瞬間,可以看到 pyspider 自動為我們識別出了首頁的 126 條超鏈接,但是我想要的僅僅是英雄列表中的每個英雄的 url 地址。
所以,接下來就要發(fā)揮 pyspider 的便捷之處了。
點擊到 web ,即可實時看到首頁:

點擊 css selector helper ,即 css 選擇器幫助。

如果之前用過 webscrape 插件的同學(爬蟲工具(二) webscraper 教程 (知乎案例)),一定很熟悉這個場景,手動選擇你想要的節(jié)點,然后系統(tǒng)自動生成。
點擊 css 樣式的右箭頭,?網(wǎng)頁自動將 css 代碼幫你替換到你光標放置的右側(cè)代碼位置:

順便,打印下 each ,看下結(jié)果。
打印發(fā)現(xiàn),這并不是我們想要的 li 節(jié)點,所以繼續(xù)進一步提取。
可以看到此行 div 里包含的 li 標簽,而 li 標簽中又包含了 a 標簽。
于是,提取如下:
def index_page(self, response): print(response) for each in response.doc('.hero-result-box>ul>li').items(): print(each('a').attr('href')) a = each('a') self.crawl(a.attr.href, callback=self.detail_page)

其實,熟悉 PyQuery 語法的朋友,一定很容易就寫出來了,這里給新手朋友放個思維導圖吧,也許你看了圖就明白了,不過多文字解釋了:

像不像一個沙漏!讓我想起了營銷學提到的漏斗模型,感興趣的同學可以自行查下資料了解。
當然,以上過程,如果你不習慣用 pyspider 給你提供的,也可以用 Chrome 等瀏覽器自帶的開發(fā)者工具自行調(diào)試。
關于詳情頁,這里只以抓取頭像,姓名,定位來舉例:
這里使用 css helper 去直接點我們想要的節(jié)點,然后移動 css 代碼到右側(cè)代碼,很容易寫出爬取節(jié)點:
def detail_page(self, response): name = response.doc('h1').text() img = response.doc('.name > img').attr('src') position = response.doc('.name-box > p').text() return { "url": response.url, "name": name, "img": img, "position": position????????}
結(jié)果:

直到這里一切都順利,但是讓我疑惑的是頭像的圖片為什么是 gif 地址?訪問下,一看這圖片一直在轉(zhuǎn)圈??!

對于圖片源地址來說,我們還是用自帶的瀏覽器來調(diào)試,方便觀察。

經(jīng)過用開發(fā)者工具的這么一看,源地址應該是這個才對,怎么一直加載不出來?再仔細觀察爬取到的地址:
http://js.18183.com/uploads/pc/yxzjol/sjk/loading.gif
和 js 肯定有關系,果不其然,這里遇到了圖片的優(yōu)化機制,圖片懶加載。此機制也可以當做反爬蟲機制的一種,隱藏了真實的圖片地址。
圖片懶加載是一種網(wǎng)頁優(yōu)化技術。圖片作為一種網(wǎng)絡資源,在被請求時也與普通靜態(tài)資源一樣,將占用網(wǎng)絡資源,而一次性將整個頁面的所有圖片加載完,將大大增加頁面的首屏加載時間。
網(wǎng)絡
那么,如何找到圖片的真實地址?這就得去看 js 如何寫的了!
拉到詳情頁最下方,看到有個懶加載的 js 。無疑就是它了!

點過去看下,可以看到有段這樣的代碼:

結(jié)合上下文看這段 js 代碼,最終能猜出, img 的真實地址屬性標簽應為:"data-original"。
那么,來試一下:


可以看到成功了。
5
結(jié)語
以上,便是 pyspider 爬取的入門教程了,當然,這只是抓取的步驟,數(shù)據(jù)離不開落地,下一篇,講下如何數(shù)據(jù)落地,并且提供源碼和這次抓取到的數(shù)據(jù)。
本篇內(nèi)容高達 2500+ 字,如果看懂了,歡迎分享給身邊對爬蟲感興趣的其他人看喲!順便支持下點個好看唄,給點動力~

▼往期精彩回顧▼本期無推薦,推薦內(nèi)容都在文中,回顧即可。
你點的每個在看,我都認真當成了喜歡
評論
圖片
表情
