首發:我的博客,更新&糾錯&回覆html
一個dota玩家與英雄契合度的計算器(查看效果),包括兩部分代碼:git
1.python的scrapy爬蟲,整體思路是page->model->result,從網頁中提取數據,組成有意義的數據結構,再拿這數據結構作點什麼。程序員
在這個項目中,爬蟲的用處是從遊久網dota數據庫上抓取dota英雄和物品的數據和照片存到本地磁盤,數據存爲json格式,方便在網頁應用中直接使用。github
2.網頁應用,使用dota英雄數據、本身編寫的小夥伴們的特徵數據、本身編寫的契合度計算公式,來計算對每一個小夥伴來講最契合他的英雄。算法
算法主要用到的英雄數據是【英雄標籤】和【英雄事務評分】,前者說明了該英雄是近戰仍是遠程,主屬性是什麼,是否能打輔助、Gank、後期等,後者則是對該英雄在Dps、Gank、Support等方面的能力的打分。數據庫
這兩個數據都來自網絡,抓取到本地以後作了一些調整,例如將原來的「眩暈」「控制」兩個標籤改成了「小控」「小團控」「團控」三個標籤,「後期」標籤變爲「後期」「大後期」兩個標籤,增長了「不穩定」「多線」「特殊」等特色, 這讓計算出的契合度更準確了一點,固然這也遠遠不是盡善盡美,例如一樣是減速,冰女和暗牧的減速固然不一樣,但還沒作更進一步的細分。json
另外,對英雄的標籤也進行了一些修改和補充,這個工做也還沒作完。網絡
我都是邊計算契合度,邊發現須要改的地方,改的目的就是使計算出的結果與實際狀況相符,但又不是硬去湊這個數字。數據結構
只有爬蟲值得一說,網頁那部分只是作實驗和玩兒的,沒太多可說,算法自行參考代碼就好。
scrapy爬蟲,很是強大,基本的需求都覆蓋到了,邏輯流程也已經定義好了,只須要程序員在特定的點編寫特定角色組件的定義代碼。 這種方式很熟悉,每一個框架都是這麼玩的,控制流是定義好的,並且在它的手裏,只有涉及業務的地方須要程序員給出本身的實現。
這個中文文檔仍是不錯的,跟着其中的教程寫helloworld,跑通了以後一點點改你的helloworld,遇到困難的地方就查文檔,或者百度一下。
關鍵類:scrapy爬蟲類,item模型類,pipeline處理器類。
爬蟲組件從指定的url獲取html字符串,並解析dom,從中採集信息,構造item對象
框架將構造好的item對象交給處理器組件,處理器組件根據item對象內容,進行處理
在本例中就是:
爬蟲從dota網站抓取html字符串,解析dom得到英雄的名稱、圖片路徑、英雄詳細頁面url,以及物品的名稱、圖片路徑
爬蟲又從英雄詳細頁面抓取html字符串,解析dom得到英雄的標籤和各類數據
每一個英雄的名稱、圖片路徑、標籤、各類數據構成英雄模型對象
每一個物品的名稱、圖片路徑構成物品模型對象
保存圖片處理器將英雄圖片和物品圖片存到本地磁盤,並根據英雄名稱、物品名稱,進行重命名(重命名以前是無心義的名稱)
保存英雄數據處理器將英雄數據存到本地磁盤的一個文本文件中,並組成json格式 7 保存物品數據處理器將物品數據存到本地磁盤的一個文本文件中,並組成json格式
顯然前2步是抓取和解析,其後兩步是作成模型對象,最後三步是處理模型對象。 順序很是清楚。
因爲我python不熟,都是邊寫代碼邊查,基本語法,庫的使用,可能有的地方寫得比較蠢,請不要在乎這些細節。
{ "blue_add": 1.75, //智力成長(藍色的是智力……) "gank": 7.2, //gank能力評分 "speed": 315, //初始速度 "id": "132", //英雄id "blue": 19, //初始智力 "armor": 7.22, //初始護甲 "excute_after": 0.51, //施法後搖 "support": 5.1, //support能力評分 "green_add": 3.2, //敏捷成長 "attack_after": 0.6, //攻擊後搖 "ballistic": 0, //彈道速度 "war": 8.1, //團戰能力評分 "red": 15, //初始力量(紅色) "tags": "敏捷,近戰,後期,減速",//標籤們 "hp": 435, //初始生命 "attack_before": 0.3,//攻擊前搖 "attack_max": 54, //初始攻擊上限 "name": "恐怖利刃", //英雄名稱 "dps": 8.9, //dps能力評分 "meat": 6.0, //肉盾能力評分(meat哈哈) "attack_min": 48, //初始攻擊下限 "red_add": 1.9, //力量成長 "excute_before": 0.5, //施法前搖 "range": 128, //攻擊距離 "green": 22, //初始敏捷(綠色) "mp": 247, //初始魔法 "push": 8.5//push能力評分 }
(英語水平見笑啦)
來個圖——