前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >送书 | 用 Neo4j 理一理王者荣耀英雄之间千丝万缕的关系,挺好玩!

送书 | 用 Neo4j 理一理王者荣耀英雄之间千丝万缕的关系,挺好玩!

作者头像
我被狗咬了
发布2021-11-09 15:48:37
4150
发布2021-11-09 15:48:37
举报
文章被收录于专栏:Python乱炖Python乱炖

本次送书之前先给大家介绍我的好友周萝卜,他是一个非常有趣的人,经常使用python做一些骚操作!今天这篇文章就是他给大家带来的分享。下面是他的公众号,大家感兴趣的可以关注一下他哦!

正文开启

当我们进入王者荣耀游戏客户端,是可以在英雄关系页面看到不同英雄之间的关联信息的,比如花木兰和兰陵王之间的宿命,安其拉和亚瑟的单恋以及露娜与铠那命运弄人的兄妹之情等等

要厘清这些英雄之间的关系,还是比较困难的,尤其是还有很多中心英雄,与其有关系的英雄多大数十个。今天我们就通过 neo4j 数据库来处理这些错综复杂的关系,看看一直伴随我们每个王者峡谷的英雄都有着怎样的“朋友圈”呢

数据获取

找了很久,还是在网上找到了一个比较全面的英雄关系数据

https://www.haosix.com/gonglue/411

网页很简单,直接上 requests 爬取即可

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup
import pandas as pd
import os
import csv


res = requests.get("https://www.haosix.com/gonglue/411")

然后我们通过 beautifulsoup 来解析网页

代码语言:javascript
复制
soup = BeautifulSoup(res.text)
div = soup.find('div', class_="bbcode-body bbcode-body-v2 markdown-body")
p_list = div.find_all("p")[2:-1]

现在列表 p_list 当中就是我们需要的数据了

接下来我们编写一个处理数据的函数,把网页上的数据转换成我们需要的形式

代码语言:javascript
复制
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, "无"]

我们来看下函数效果

代码语言:javascript
复制
deal_str('裴擒虎:杨玉环(女神与同伴)、公孙离(收留之人与同伴)、弈星(互补的同伴)、明世隐(下属与首领)、苏烈(下属与曾经上司)')

得到了英雄名称以及和他有关系的英雄关系信息

再下来就是保存到 csv 文件

代码语言:javascript
复制
def save_data_name(data_name, list_info):
    if not os.path.exists(data_name + r'.csv'):
        # 表头
        name = ["name","id"]
        # 建立DataFrame对象
        file_test = pd.DataFrame(columns=name, data=list_info)
        # 数据写入
        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)

一切准备工作完毕之后,就可以整合代码了

代码语言:javascript
复制
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

处理过程如下

这要我们就得到了两个 csv 文件,一个保存了英雄名称,另一个保存了英雄关系信息

Neo4j 使用简介

Neo4j 是目前最为流行的图数据库,用于存储丰富的关系数据。图是由顶点(Vertex),边(Edge)和属性(Property)组成的,顶点和边都可以设置属性,顶点也称作节点,边也称作关系,每个节点和关系都可以由一个或多个属性

对于 Neo4j 的安装就不再赘述了,想我这里就是在自己本地的 Windows 上安装了一个,还是比较简单的

安装完成之后,我们一般可以在本地开发 Neo4j 控制浏览器

http://localhost:7474/browser/

然后我们把前面生成的两个文件放到 Neo4j 安装目录的 import 文件夹下(安全考虑,Neo4j 默认只能从该目录下导入文件)

接下来我们在 Neo4j 命令行中编写 Cypher 命令,先导入 csv 文件 英雄名称文件:

代码语言:javascript
复制
LOAD CSV WITH HEADERS FROM "file:///name.csv" AS line MERGE (p:person{name:line.name,id:line.id})

英雄关系文件:

代码语言:javascript
复制
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)

如果一切不出意外,我们就已经完成了数据导入,下面就可以查看关系了

代码语言:javascript
复制
MATCH p=()-->() return p;

我们先来看一张整体图

不是特别清晰,我们来看看局部

好了,今天的分享就到这里,我们下次见,不要忘记一键三连哦!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python乱炖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据获取
  • Neo4j 使用简介
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档