送書 | 用 Neo4j 理一理王者榮耀英雄之間千絲萬縷的關(guān)系,挺好玩!
本次送書之前先給大家介紹我的好友周蘿卜,他是一個(gè)非常有趣的人,經(jīng)常使用python做一些騷操作!今天這篇文章就是他給大家?guī)淼姆窒?。下面是他的公眾?hào),大家感興趣的可以關(guān)注一下他哦!
正文開啟
當(dāng)我們進(jìn)入王者榮耀游戲客戶端,是可以在英雄關(guān)系頁(yè)面看到不同英雄之間的關(guān)聯(lián)信息的,比如花木蘭和蘭陵王之間的宿命,安其拉和亞瑟的單戀以及露娜與鎧那命運(yùn)弄人的兄妹之情等等
要厘清這些英雄之間的關(guān)系,還是比較困難的,尤其是還有很多中心英雄,與其有關(guān)系的英雄多大數(shù)十個(gè)。今天我們就通過 neo4j 數(shù)據(jù)庫(kù)來處理這些錯(cuò)綜復(fù)雜的關(guān)系,看看一直伴隨我們每個(gè)王者峽谷的英雄都有著怎樣的“朋友圈”呢
數(shù)據(jù)獲取
找了很久,還是在網(wǎng)上找到了一個(gè)比較全面的英雄關(guān)系數(shù)據(jù)
https://www.haosix.com/gonglue/411

網(wǎng)頁(yè)很簡(jiǎn)單,直接上 requests 爬取即可
import?requests
from?bs4?import?BeautifulSoup
import?pandas?as?pd
import?os
import?csv
res?=?requests.get("https://www.haosix.com/gonglue/411")
然后我們通過 beautifulsoup 來解析網(wǎng)頁(yè)
soup?=?BeautifulSoup(res.text)
div?=?soup.find('div',?class_="bbcode-body?bbcode-body-v2?markdown-body")
p_list?=?div.find_all("p")[2:-1]
現(xiàn)在列表 p_list 當(dāng)中就是我們需要的數(shù)據(jù)了
接下來我們編寫一個(gè)處理數(shù)據(jù)的函數(shù),把網(wǎng)頁(yè)上的數(shù)據(jù)轉(zhuǎn)換成我們需要的形式
def?deal_str(data):
????rel_dict?=?{}
????name?=?data.split(":")
????name1?=?name[0]
????name_rel?=?name[1].split("、")
????if?r"("?in?name_rel[0]:
????????for?i?in?name_rel:
????????????tmp?=?i.split("(")
????????????rel_dict[tmp[0]]?=?tmp[1].split(")")[0]
????????return?[name1,?rel_dict]
????return?[name1,?"無"]
我們來看下函數(shù)效果
deal_str('裴擒虎:楊玉環(huán)(女神與同伴)、公孫離(收留之人與同伴)、弈星(互補(bǔ)的同伴)、明世隱(下屬與首領(lǐng))、蘇烈(下屬與曾經(jīng)上司)')

得到了英雄名稱以及和他有關(guān)系的英雄關(guān)系信息
再下來就是保存到 csv 文件
def?save_data_name(data_name,?list_info):
????if?not?os.path.exists(data_name?+?r'.csv'):
????????#?表頭
????????name?=?["name","id"]
????????#?建立DataFrame對(duì)象
????????file_test?=?pd.DataFrame(columns=name,?data=list_info)
????????#?數(shù)據(jù)寫入
????????file_test.to_csv(data_name?+?r'.csv',?encoding='utf-8',?index=False)
????else:
????????with?open(data_name?+?r'.csv',?'a+',?newline='',?encoding='utf-8')?as?file_test:
????????????#?追加到文件后面
????????????writer?=?csv.writer(file_test)
????????????#?寫入文件
????????????writer.writerows(list_info)
一切準(zhǔn)備工作完畢之后,就可以整合代碼了
content?=?{}
index?=?0
for?p?in?p_list:
????content?=?deal_str(p.text)
????save_data_name("name",?[[content[0],?index]])
????if?type(content[1])?==?dict:
????????for?k,v?in?content[1].items():
????????????print([content[0],?k,?v])
????????????save_data_relation("relation",?[[content[0],?k,?v]])
????index?+=?1
處理過程如下

這要我們就得到了兩個(gè) csv 文件,一個(gè)保存了英雄名稱,另一個(gè)保存了英雄關(guān)系信息


Neo4j 使用簡(jiǎn)介
Neo4j 是目前最為流行的圖數(shù)據(jù)庫(kù),用于存儲(chǔ)豐富的關(guān)系數(shù)據(jù)。圖是由頂點(diǎn)(Vertex),邊(Edge)和屬性(Property)組成的,頂點(diǎn)和邊都可以設(shè)置屬性,頂點(diǎn)也稱作節(jié)點(diǎn),邊也稱作關(guān)系,每個(gè)節(jié)點(diǎn)和關(guān)系都可以由一個(gè)或多個(gè)屬性
對(duì)于 Neo4j 的安裝就不再贅述了,想我這里就是在自己本地的 Windows 上安裝了一個(gè),還是比較簡(jiǎn)單的
安裝完成之后,我們一般可以在本地開發(fā) Neo4j 控制瀏覽器
http://localhost:7474/browser/

然后我們把前面生成的兩個(gè)文件放到 Neo4j 安裝目錄的 import 文件夾下(安全考慮,Neo4j 默認(rèn)只能從該目錄下導(dǎo)入文件)

接下來我們?cè)?Neo4j 命令行中編寫 Cypher 命令,先導(dǎo)入 csv 文件
英雄名稱文件:
LOAD?CSV?WITH?HEADERS?FROM?"file:///name.csv"?AS?line?MERGE?(p:person{name:line.name,id:line.id})

英雄關(guān)系文件:
LOAD?CSV?WITH?HEADERS?FROM?"file:///relation.csv"?AS?relations?MATCH?(entity1:person{name:relations.name1}),?(entity2:?person{name:relations.name2})?CREATE?(entity1)-[:rel{relation:relations.relation}]->(entity2)

如果一切不出意外,我們就已經(jīng)完成了數(shù)據(jù)導(dǎo)入,下面就可以查看關(guān)系了
MATCH?p=()-->()?return?p;

我們先來看一張整體圖

不是特別清晰,我們來看看局部



好了,今天的分享就到這里,我們下次見,不要忘記一鍵三連哦!
送書時(shí)間
本次送書是《對(duì)比Excel,輕松學(xué)習(xí)Python報(bào)表自動(dòng)化》,這本書的主題就是數(shù)據(jù)分析師角度的報(bào)表自動(dòng)化。
全書主要分為?4?個(gè)部分:
第 1 部分介紹 Python 基礎(chǔ)知識(shí),讓讀者對(duì) Python 中常用的操作和概念有所了解;
第 2 部分介紹格式相關(guān)的設(shè)置方法,包括字體設(shè)置、條件格式設(shè)置等內(nèi)容;
第 3 部分介紹各種類型的函數(shù);
第 4 部分介紹自動(dòng)化相關(guān)的其他技能,比如自動(dòng)發(fā)送郵件、自動(dòng)打包等操作。
真正做過數(shù)據(jù)分析師的人應(yīng)該知道,一份報(bào)表大體其實(shí)就兩部分:數(shù)據(jù)處理+格式設(shè)置。
數(shù)據(jù)處理就是對(duì)數(shù)據(jù)進(jìn)行缺失值、重復(fù)值、異常值、還有加減乘除等處理。
格式設(shè)置主要就是字體設(shè)置、單元格設(shè)置、條件格式這些。
關(guān)于數(shù)據(jù)處理,第一本書《對(duì)比Excel,輕松學(xué)習(xí)Python數(shù)據(jù)分析》講得差不多了,《對(duì)比Excel,輕松學(xué)習(xí)Python報(bào)表自動(dòng)化》一書更多講述格式設(shè)置和函數(shù)運(yùn)算等內(nèi)容。
點(diǎn)擊下方回復(fù):送書? 即可!
大家如果有什么建議,歡迎掃一掃二維碼私聊小編~回復(fù):加群?可加入Python技術(shù)交流群
