当前位置: 首页 > news >正文

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

爬取信息说明

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

创建英雄类型节点

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

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

添加到图数据库中

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

创建英雄信息节点

获取英雄信息

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

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

保存英雄信息

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))

完整代码

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()

实现效果

在这里插入图片描述

相关文章:

  • Spring源码学习:SpringMVC(2)DispatcherServlet初始化【子容器9大组件】
  • 【YOLO目标检测车牌数据集】共10000张、已标注txt格式、有训练好的yolov5的模型
  • python中logging的用法
  • 433按键单片机解码
  • Meta AI 发布 Llama 3.2
  • 赛氪作媒体支持单位受邀参加首届科普翻译与跨学科专业学术研讨会
  • OCR Fusion: EasyOCR/Tesseract/PaddleOCR/TrOCR/GOT
  • 不同的浏览器、服务器和规范对 URL 长度的限制
  • 前端面试经验总结2(经典问题篇)
  • LIMS和LIS的主要区别
  • InternVL 微调实践
  • 计算机网络自顶向下(1)---网络基础
  • 第十四周周报:Transformer for CV
  • SparseArray为啥在android 源码中经常被使用,原因何在
  • 画个心,写个花!Python Turtle库带你玩转创意绘图!
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Apache的基本使用
  • mac修复ab及siege安装
  • React+TypeScript入门
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Xmanager 远程桌面 CentOS 7
  • 第十八天-企业应用架构模式-基本模式
  • 好的网址,关于.net 4.0 ,vs 2010
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序填坑清单
  • 学习笔记:对象,原型和继承(1)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 自定义函数
  • ​Redis 实现计数器和限速器的
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ## 基础知识
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (done) 两个矩阵 “相似” 是什么意思?
  • (SERIES12)DM性能优化
  • (二)原生js案例之数码时钟计时
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (回溯) LeetCode 78. 子集
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十六)串口UART
  • (转)详解PHP处理密码的几种方式
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net 6.0--通用帮助类--FileHelper
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net dataexcel 脚本公式 函数源码
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET中 MVC 工厂模式浅析
  • .Net中wcf服务生成及调用
  • .net专家(高海东的专栏)