package cn.shaoxiongdu.leagueoflegends.reptile;
import cn.shaoxiongdu.leagueoflegends.bean.Hero;
import cn.shaoxiongdu.leagueoflegends.dao.HeroDao;
import cn.shaoxiongdu.leagueoflegends.dao.impl.HeroDaoImpl;
import cn.shaoxiongdu.leagueoflegends.utils.RequestUtils;
import org.junit.Test;
import java.util.List;
/**
* @description: 英雄联盟官网爬取英雄数据类
* @author: shaoxiongdu <email@shaoxiongdu.cn>
* @date: 2021-10-23 | 14:26
*/
public class ReptileHeroData {
//操作数据库
private static HeroDao heroDao = new HeroDaoImpl();
/**
* 通过ID爬取英雄的网络前缀
*/
private static final String REPTILE_HERO_DATA_BY_ID_URL = "https://game.gtimg.cn/images/lol/act/img/js/hero/3.js";
public static void main(String[] args) throws Exception {
//获取所有英雄ID
reptileHeroId();
List<Hero> heroes = heroDao.queryAll();
for (Hero hero : heroes) {
Hero h = reptileHeroById(hero.getId());
System.out.println("爬取到数据: " + h);
//更新到数据库
heroDao.updateHero(h);
}
}
public static Hero reptileHeroById(String id) throws Exception {
//拼接网络请求地址
String result = RequestUtils.sendRequest("https://game.gtimg.cn/images/lol/act/img/js/hero/" + id + ".js");
Hero hero = new Hero();
//id
hero.setId(result.substring(result.indexOf("heroId") + 9,result.indexOf("name") - 3));
//名字
hero.setName(result.substring(result.indexOf("title") + 8,result.indexOf("roles") - 3));
//英文名字
hero.setEnglishName(result.substring(result.indexOf("alias") + 8,result.indexOf("title") - 3));
//称号
hero.setTitle(result.substring(result.indexOf("name") + 7,result.indexOf("alias") - 3));
//背景故事
hero.setStory(result.substring(result.indexOf("shortBio") + 11,result.indexOf("camp") - 3));
//物理攻击
hero.setAttack(Double.parseDouble(result.substring(result.indexOf("attack") + 9,result.indexOf("defense") - 3)));
//防御
hero.setDefense(Double.parseDouble(result.substring(result.indexOf("defense") + 10,result.indexOf("magic") - 3)));
//魔法攻击
hero.setMagic(Double.parseDouble(result.substring(result.indexOf("magic") + 8,result.indexOf("difficulty") - 3)));
//上手难度
hero.setDifficulty(Double.parseDouble(result.substring(result.indexOf("difficulty") + 13,result.indexOf("hp") - 3)));
//血量
hero.setHp(Double.parseDouble(result.substring(result.indexOf("hp") + 5,result.indexOf("hpperlevel") - 3)));
//移动速度
hero.setMoveSpeed(Double.parseDouble(result.substring(result.indexOf("movespeed") + 12,result.indexOf("armor") - 3)));
//攻击距离
hero.setAttackRange(Double.parseDouble(result.substring(result.indexOf("attackrange") + 14,result.indexOf("hpregen") - 3)));
//攻速
hero.setAttackSpeed(Double.parseDouble(result.substring(result.indexOf("attackspeed") + 14,result.indexOf("attackspeedperlevel") - 3)));
//队友提示
hero.setAllyTips(result.substring(result.indexOf("allytips") + 13,result.indexOf("enemytips") - 4).replaceAll("n","\n"));
//敌军提示
if(result.indexOf("enemytips") + 15 < result.indexOf("heroVideoPath") - 4){
hero.setEnemyTips(result.substring(result.indexOf("enemytips") + 15,result.indexOf("heroVideoPath") - 4).replaceAll("n","\n"));
}
////////////////////////////////////////////技能
String spells = result.substring(result.indexOf("spells") + 9,result.indexOf("version") - 3);
String[] split = spells.split("},");
//e技能
String spellE = split[0];
//技能名称
hero.seteSkillName(spellE.substring(spellE.indexOf("name") + 7,spellE.indexOf("description") - 3));
//技能描述
hero.seteSkillDescription(spellE.substring(spellE.indexOf("description") + 14,spellE.indexOf("abilityIconPath") - 3));
//技能头像
hero.seteSkillIconUrl(spellE.substring(spellE.indexOf("abilityIconPath") + 18,spellE.indexOf("abilityVideoPath") - 3));
//被动技能
String spellPassive = split[1];
//技能名称
hero.setPassiveSkillName(spellPassive.substring(spellPassive.indexOf("name") + 7,spellPassive.indexOf("description") - 3));
//技能描述
hero.setPassiveSkillDescription(spellPassive.substring(spellPassive.indexOf("description") + 14,spellPassive.indexOf("abilityIconPath") - 3));
//技能头像
hero.setPassiveSkillIconUrl(spellPassive.substring(spellPassive.indexOf("abilityIconPath") + 18,spellPassive.indexOf("abilityVideoPath") - 3));
//q技能
String spelleQ = split[2];
//技能名称
hero.setqSkillName(spelleQ.substring(spelleQ.indexOf("name") + 7,spelleQ.indexOf("description") - 3));
//技能描述
hero.setqSkillDescription(spelleQ.substring(spelleQ.indexOf("description") + 14,spelleQ.indexOf("abilityIconPath") - 3));
//技能头像
hero.setqSkillIconUrl(spelleQ.substring(spelleQ.indexOf("abilityIconPath") + 18,spelleQ.indexOf("abilityVideoPath") - 3));
//r技能
String spelleR = split[3];
//技能名称
hero.setrSkillName(spelleR.substring(spelleR.indexOf("name") + 7,spelleR.indexOf("description") - 3));
//技能描述
hero.setrSkillDescription(spelleR.substring(spelleR.indexOf("description") + 14,spelleR.indexOf("abilityIconPath") - 3));
//技能头像
hero.setrSkillIconUrl(spelleR.substring(spelleR.indexOf("abilityIconPath") + 18,spelleR.indexOf("abilityVideoPath") - 3));
//w技能
String spelleW = split[4];
//技能名称
hero.setwSkillName(spelleW.substring(spelleW.indexOf("name") + 7,spelleW.indexOf("description") - 3));
//技能描述
hero.setwSkillDescription(spelleW.substring(spelleW.indexOf("description") + 14,spelleW.indexOf("abilityIconPath") - 3));
//技能头像
hero.setwSkillIconUrl(spelleW.substring(spelleW.indexOf("abilityIconPath") + 18,spelleW.indexOf("abilityVideoPath") - 3));
//版本
hero.setVersion(result.substring(result.indexOf("version") + 10,result.indexOf("fileName") - 3).replaceAll("n","\n"));
return hero;
}
/**
* 获取所有的英雄ID
*/
@Test
public static void reptileHeroId() {
//官网数据
String info = "<ul id=\"jSearchHeroDiv\" class=\"imgtextlist\"><li><a href=\"info-defail.shtml?id=1\" title=\"黑暗之女 安妮\" onclick=\"PTTSendClick('btn,'heros1','黑暗之女安妮');\"><img src=\"//game.gtimg.cn/images/lol/act/img/champion/Annie.png\" alt=\"黑暗之女 安妮\"><p>黑暗之女</p><span class=\"sbg\"><i class=\"commspr commico-search\"></i></span></a></li><li><a href=\"info-defail.shtml?id=2\" title=\"狂战士 奥拉夫\" onclick=\"PTTSendClick('btn,'heros2','狂战士奥拉夫');\"><img src=\"//game.gtimg.cn/images/lol/act/img/champion/Olaf.png\" alt=\"狂战士 奥拉夫\"><p>狂战士</p><span class=\"sbg\"><i class=\"commspr commico-search\"></i></span></a></li><li><a href=\"info-defail.shtml?id=3\" title=\"正义巨像 加里奥\" onclick=\"PTTSendClick('btn,'heros3','正义巨像加里奥');\"><img src=\"//game.gtimg.cn/images/lol/act/img/champion/Galio.png\" alt=\"正义巨像 加里奥\"><p>正义巨像</p><span class=\"sbg\"><i class=\"commspr commico-search\"></i></span></a></li><li><a href=\"info-defail.shtml?id=4\" title=\"卡牌大师 崔斯特\" onclick=\"PTTSendClick('btn,'heros4','卡牌大师崔斯特');\"><img src=\"//game.gtimg.cn/images/lol/act/img/champion/TwistedFate.png\" alt=\"卡牌大师 崔斯特\"><p>卡牌大师</p><span class=\"sbg\"><i class=\"commspr commico-sea