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

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


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

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




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

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

4. 自動(dòng)生成代碼


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

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



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

點(diǎn)擊 css selector helper ,即 css 選擇器幫助。

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

順便,打印下 each ,看下結(jié)果。
打印發(fā)現(xiàn),這并不是我們想要的 li 節(jié)點(diǎn),所以繼續(xù)進(jìn)一步提取。
可以看到此行 div 里包含的 li 標(biāo)簽,而 li 標(biāo)簽中又包含了 a 標(biāo)簽。
于是,提取如下:
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)

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

像不像一個(gè)沙漏!讓我想起了營(yíng)銷學(xué)提到的漏斗模型,感興趣的同學(xué)可以自行查下資料了解。
當(dāng)然,以上過程,如果你不習(xí)慣用 pyspider 給你提供的,也可以用 Chrome 等瀏覽器自帶的開發(fā)者工具自行調(diào)試。
關(guān)于詳情頁,這里只以抓取頭像,姓名,定位來舉例:
這里使用 css helper 去直接點(diǎn)我們想要的節(jié)點(diǎn),然后移動(dòng) css 代碼到右側(cè)代碼,很容易寫出爬取節(jié)點(diǎn):
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)圈??!

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

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

點(diǎn)過去看下,可以看到有段這樣的代碼:

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


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

▼往期精彩回顧▼本期無推薦,推薦內(nèi)容都在文中,回顧即可。
你點(diǎn)的每個(gè)在看,我都認(rèn)真當(dāng)成了喜歡
