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

devtools/2024/9/30 4:10:13/

爬取信息说明

  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/devtools/119050.html

相关文章

深度学习后门攻击分析与实现(二)

前言 在本系列的第一部分中,我们已经掌握了深度学习中的后门攻击的特点以及基础的攻击方式,现在我们在第二部分中首先来学习深度学习后门攻击在传统网络空间安全中的应用。然后再来分析与实现一些颇具特点的深度学习后门攻击方式。 深度学习与网络空间…

Redis的数据类型常用命令

目录 前言 String字符串 常见命令 set get mget mset setnx incr incrby decr decyby append Hash哈希 常见命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx List 列表 常见命令 lpush lrange lpushx rpush rpushhx lpop…

CSS开发全攻略

目录 一、CSS基础入门(一)CSS概述1.CSS的定义与作用2.CSS的历史与发展3.CSS的核心概念(1)选择器(Selector)(2)声明(Declaration)(3)规…

【个人笔记】数据一致性的解决方案

保证数据一致性:指保证redis里的数据和mysql的数据是一致的,不能说mysql更新了,但redis里面的还是旧的数据,反之亦然 先说结论:增删改的时候,把Redis中的缓存删了 为什么不先更新数据库,再更新…

免费制作证件照的小程序源码

1、效果展示 证件照制作,证件照免费制作,证件照调用api源码,解析代码。证件照制作小程序包,可以下载程序包,最初级版本免费下载。以上是高级版本。如果你有开发能力的话可以自己写前端,然后以下调用以下api…

5分钟精通Excel在go中的使用

一些简单操作可以在官方文档中找到,应该足够无经验的朋友们入门 介绍 - 《Excelize v2.2 中文文档》 - 书栈网 BookStack 这里贴一个中文版的链接(以excelize库为例,相对其他库来说,体验很不错),不过要注…

flink将窗口增量聚合算子和窗口全量聚合算子连用

在flink中,开窗后的聚合方式有两种,增量聚合和全量聚合,前者处理速度快,不积压数据,但是拿不到窗口中全量的信息,后者积压数据但是能拿到窗口内全量的数据。两者各有利弊。 因此滚动聚合窗口和全量聚合窗口…

Spring Boot 点餐系统:提升您的餐饮体验

第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作,对于网上点餐系统所牵扯的管理及数据保存都是非常多的,例如管理员;首页、个人中心、用户管理、美食店管理、美食分类管理、美食信息管理、美食订单管理、美食评价管理…