Python爬虫爬取王者荣耀英雄信息并保存到图数据库

news/2024/9/30 4:16:25/

爬取信息说明

  1. 英雄名称
  2. 英雄类型
  3. 英雄包含的所有皮肤名称

创建英雄类型节点

王者荣耀官方给出的英雄类型是以下几种:
在这里插入图片描述
直接准备好英雄类型词典

python">hero_type_dict = ['战士', '法师', '坦克', '刺客', '射手', '辅助'
]

添加到图数据库

python">def create_hero_type_node():for hero_type in hero_type_dict:cypher = "MERGE (n:HeroType{label: '" + hero_type + "'})"graph.run(cypher).data()print('创建英雄类型节点成功')

创建英雄信息节点

获取英雄信息

python">def get_hero_info_list():# 英雄的全部信息的urlhero_info = 'https://pvp.qq.com/web201605/js/herolist.json'# 获取英雄的全部信息response = requests.get(hero_info)# 转为字典格式hero_info_dict = json.loads(response.text)return hero_info_dict

打印的内容如下:
在这里插入图片描述
这里需要注意的是,部分英雄包含两个英雄类别。

保存英雄信息

python">def create_hero_node():hero_info_dict = get_hero_info_list()# 1战士 2法师 3坦克 4刺客 5射手 6辅助for hero in hero_info_dict:# print(hero)# print(str(hero.get('cname')) + '===' + str(hero_type[hero.get('hero_type')-1]) + '===' + str(hero.get('skin_name')))hero_type_list = [str(hero_type_dict[hero.get('hero_type') - 1])]if '|' in str(hero.get('skin_name')):skin_name_list = hero.get('skin_name').split('|')else:skin_name_list = [hero.get('skin_name')]if 'hero_type2' in str(hero):hero_type_list.append(str(hero_type_dict[hero.get('hero_type2') - 1]))# 创建英雄信息节点hero_cypher = "MERGE (n:Hero{label: '" + str(hero.get('cname')) + "'})"graph.run(hero_cypher).data()# 创建英雄->类型关系for hero_type in hero_type_list:cypher_rel = "MATCH(h:Hero{label:'" + str(hero.get('cname')) + "'}),(t:HeroType{label:'" + hero_type + "'}) MERGE (h)-[r:类型]->(t) RETURN h,r,t"graph.run(cypher_rel).data()for skin_name in skin_name_list:# 创建英雄皮肤节点cypher = "MERGE (n:Skin{label:'" + skin_name + "'})"graph.run(cypher).data()# 创建英雄->皮肤关系cypher_rel = "MATCH(h:Hero{label:'" + str(hero.get('cname')) + "'}),(s:Skin{label:'" + skin_name + "'}) MERGE (h)-[r:皮肤]->(s) RETURN h,r,s"graph.run(cypher_rel).data()print(str(hero.get('cname')) + '===' + str(hero_type_list) + '===' + str(skin_name_list))

完整代码

python">import jsonimport requests
from bs4 import BeautifulSoup
from py2neo import Graph, RelationshipMatcher, NodeMatcherfrom dict import hero_type_dicturl = "bolt://localhost:7687"
username = "neo4j"
password = 'Suns3535'
graph = Graph(url, auth=(username, password), name="wzry")
node_matcher = NodeMatcher(graph=graph)
relationship_matcher = RelationshipMatcher(graph=graph)def get_hero_info_list():# 英雄的全部信息的urlhero_info = 'https://pvp.qq.com/web201605/js/herolist.json'# 获取英雄的全部信息response = requests.get(hero_info)# 转为字典格式hero_info_dict = json.loads(response.text)return hero_info_dictdef create_hero_type_node():for hero_type in hero_type_dict:cypher = "MERGE (n:HeroType{label: '" + hero_type + "'})"graph.run(cypher).data()print('创建英雄类型节点成功')def create_hero_node():hero_info_dict = get_hero_info_list()# 1战士 2法师 3坦克 4刺客 5射手 6辅助for hero in hero_info_dict:# print(hero)# print(str(hero.get('cname')) + '===' + str(hero_type[hero.get('hero_type')-1]) + '===' + str(hero.get('skin_name')))hero_type_list = [str(hero_type_dict[hero.get('hero_type') - 1])]if '|' in str(hero.get('skin_name')):skin_name_list = hero.get('skin_name').split('|')else:skin_name_list = [hero.get('skin_name')]if 'hero_type2' in str(hero):hero_type_list.append(str(hero_type_dict[hero.get('hero_type2') - 1]))# 创建英雄信息节点hero_cypher = "MERGE (n:Hero{label: '" + str(hero.get('cname')) + "'})"graph.run(hero_cypher).data()# 创建英雄->类型关系for hero_type in hero_type_list:cypher_rel = "MATCH(h:Hero{label:'" + str(hero.get('cname')) + "'}),(t:HeroType{label:'" + hero_type + "'}) MERGE (h)-[r:类型]->(t) RETURN h,r,t"graph.run(cypher_rel).data()for skin_name in skin_name_list:# 创建英雄皮肤节点cypher = "MERGE (n:Skin{label:'" + skin_name + "'})"graph.run(cypher).data()# 创建英雄->皮肤关系cypher_rel = "MATCH(h:Hero{label:'" + str(hero.get('cname')) + "'}),(s:Skin{label:'" + skin_name + "'}) MERGE (h)-[r:皮肤]->(s) RETURN h,r,s"graph.run(cypher_rel).data()print(str(hero.get('cname')) + '===' + str(hero_type_list) + '===' + str(skin_name_list))# 创建英雄类型节点
create_hero_type_node()
# 创建英雄信息
create_hero_node()

实现效果

在这里插入图片描述


http://www.ppmy.cn/news/1532232.html

相关文章

STM32LL库之printf函数重定向

1. 加入以下代码 int fputc(int ch,FILE *f) {LL_USART_TransmitData8(USART1,ch);while(!LL_USART_IsActiveFlag_TXE(USART1));//需要等待发送完成return(ch); }记得添加 stdio.h 头文件 2. 在MDK中勾选:Use MicroLIB

极狐GitLab 17.4 重点功能解读【四】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

java.lang.IllegalArgumentException: Could not resolve placeholder

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 配置文件里面的内容没有生效。 需要指定一下Active profiles:

MySQL的基础用法一

数据库的操作 对库的操作 SQL通用语法规则介绍 创建数据库 使用数据库 查询所有数据库 查询当前数据库 删除数据库 对库中表的操作 创建一个表 查询当前数据库所有表 查询表结构 查询指定表的建表语句 🚘🚘🚘正片开始 SQL通用语…

python requests模块学习

1、模块介绍 Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。 2、get请求示例 # 导入 requests 包 import requests# 发送请求 x requests.get(https://www.run.com/)# 返回 http 的状态码 print(x.stat…

C语言基本语法————基本数据类型、变量与常量

一、基本数据类型 在C语言这门严谨的语言中,所有的数都不能像数学中一样直接写,为了节省计算机的储存空间和优化计算,将数据分为一下几种类型; 1、整型 (1)、有符号整型 有符号整型的数据类型通常包括 int、short、long、long lo…

cpu路、核、线程、主频、缓存

路:主板插口实际插入的 CPU 个数,也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如,一台服务器可能有2路或4路插槽,这意味着它最多可以安装2个或4个物理处理器。 核:单块 CPU 上面能…

基于SSM+小程序的在线课堂微信管理系统(在线课堂1)(源码+sql脚本+视频导入教程+文档)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 &emsp1、管理员实现了首页、个人中心、用户管理、课程分类管理、课程信息管理、课程订阅管理、课程视频管理、公告栏管理、留言板管理、系统管理。 2、用户实现了首页、课程信息、公…