云顶之奕S2上线了,用爬虫分析云顶之奕两个赛季都未曾登场的牌

云顶之奕S2上线了,回顾两个赛季,有哪些暂时失宠的英雄们还未曾登场呢?作为程序猿,你让咱一个个对照数出来,是不存在的,不如爬取一下数据,分析一波,既有趣,又锻炼了编程,岂不快哉!

新建maven项目,导入jsoup与httpclient与jackson等依赖。

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- httpClient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><!-- Jsoup --><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.8.3</version></dependency><!-- 工具包 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.3</version></dependency></dependencies>

 

登录lol官网 https://lol.qq.com/act/a20190920worlds/index.shtml?e_code=491407&idataid=278057

1.获取全部英雄数据

点击游戏资料,里边会有lol全部英雄信息。打开浏览器F12分析,英雄是从“https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js” 获取的json数据。

import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;import com.fasterxml.jackson.databind.ObjectMapper;import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;@SuppressWarnings("static-access")
public  class GetAllHero {private static PoolingHttpClientConnectionManager cm;public GetAllHero() {this.cm = new PoolingHttpClientConnectionManager();
//        设置最大连接数this.cm.setMaxTotal(100);
//        设置每个主机最大连接数this.cm.setDefaultMaxPerRoute(10);}public static void main(String[] args) throws Exception {//      开启爬虫getAllHeros();}public static HashSet<String> getAllHeros() throws Exception {//解析地址String url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js";   //首页String html = doGetHtml(url);HashSet<String> allHeroSet = parse(html);return allHeroSet;}/*** 根据请求地址下载页面数据** @param url* @return 页面数据*/public static String doGetHtml(String url) {
//    获取httpClient对象CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
//     创建httpGet请求对象,设置url地址HttpGet httpGet = new HttpGet(url);httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36");
//        设置请求信息httpGet.setConfig(getConfig());
//        使用httpClient发起请求,获取响应CloseableHttpResponse response = null;try {response = httpClient.execute(httpGet);
//            解析响应,返回结果if (response.getStatusLine().getStatusCode() == 200) {
//                判断响应体Entity是否不为空,如果不为空,就可以使用Entityutilsif (response.getEntity() != null) {String content = EntityUtils.toString(response.getEntity(), "UTF-8");return content;}}} catch (IOException e) {e.printStackTrace();} finally {
//            关闭responseif (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}}}
//        解析响应,返回结果return "";}@SuppressWarnings("unchecked")private static HashSet<String> parse(String json) throws Exception {HashSet<String> allHeroSet = new HashSet<String>();HashMap<String, Object> herosMap = new HashMap<String, Object>();ObjectMapper mapper = new ObjectMapper();herosMap = (HashMap<String, Object>) mapper.readValue(json, Map.class);List<Map<String, Object>> herosList = (List<Map<String, Object>>) herosMap.get("hero");for (Map<String, Object> map : herosList) {allHeroSet.add((map.get("name").toString().trim()+map.get("title").toString().trim()));}return allHeroSet;}//    设置请求信息private static RequestConfig getConfig() {RequestConfig config = RequestConfig.custom().setConnectTimeout(1000).setConnectionRequestTimeout(500).setSocketTimeout(10000)  //数据传输的最长时间.build();return config;}
}

这时,我获取到的所有的英雄名字和称号都放到了allHeroSet中去了,为啥要用set?为啥要把名字和称号都获取到?请接着往下看。

2.获取云顶之奕牌数据

打开云顶之奕的资料,F12 ---> 网络中找到:

TF开头的都是云顶之奕的资料,其中V3是新赛季的资料。

这样,有了url,就可以获取到英雄的json数据了。点击"TFTHerosData.js",这里边是云顶之奕两个赛季的全部牌的英雄数据:

如图,获取到的这些就是unicode编码的英雄的json数据。将这些数据copy出来,(开头的function.....不要,只要function返回的数据)用网上的在线json解析工具格式化一下,然后将格式化好的json串copy到一个文件中,  我们通过读取文件的方式解析 数据。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;/*** 得到云顶所有英雄的数据**/
public class GetYdHero {public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {getYdHeros();}@SuppressWarnings("unchecked")public static HashSet<String> getYdHeros() throws IOException{HashSet<String> heroSet = new HashSet<String>();File allYdHeroJson = new File("D:\\Users\\zzh\\eclipse-workspace\\crawler\\resources/allYdHero.json");BufferedReader bufferedReader = new BufferedReader(new FileReader(allYdHeroJson));String line = null;StringBuilder result = new StringBuilder();while ((line = bufferedReader.readLine()) != null) {result.append(line);}HashMap<String, Object> herosMap = new HashMap<String, Object>();ObjectMapper mapper = new ObjectMapper();herosMap = (HashMap<String, Object>) mapper.readValue(result.toString(),Map.class);for (Entry<String, Object> e : herosMap.entrySet()) {Map<String, Object> heroData = (Map<String, Object>) e.getValue();for (Entry<String, Object> a : heroData.entrySet()) {if("hero_tittle".equals(a.getKey())) {heroSet.add(a.getValue().toString().trim());}}}return heroSet;}}

    以上为什么要用set呢,因为set中不允许有重复的值,云顶之奕新版本中,大元素使拉克丝由于羁绊不固定,所以她出现了7次,琪亚娜出现了四次,为了避免重复,用set存储遍历出来的数据要好处理一些。

   另外,我发现获取到的云顶的数据中,有时候会把英雄的名字与称号搞错,例如,丽桑卓是名字hero_name,但是获取到的数据中却把名字放到了hero-tittle中去了。(这个tittle是不是搞错了?明明是title,看来lol官方程序猿英语也不咋地?)总之,就是名字称号整的很乱,这为接下来的分析数据带来了困扰,于是我干脆只把hero_tittle存储到了set中去了。

3.做分析

新建一个比较类,

import java.util.HashSet;/*** 比较云顶之奕英雄与lol全英雄* * @author zzh**/
public class CompareHeros {public static void main(String[] args) throws Exception {compare();}private static void compare() throws Exception {// 得到全英雄HashSet<String> allHeros = GetAllHero.getAllHeros();// 得到云顶英雄HashSet<String> ydHeros = GetYdHero.getYdHeros();int j = 0;//计算未出场的英雄for (String allHero : allHeros) {int i = 0;for (String ydHero : ydHeros) {if (allHero.contains(ydHero)) {
//				    System.out.println(allHero); 云顶之奕出场的英雄break;}++i;}if(i==ydHeros.size()) {System.out.println(allHero+ ++j);}}}}

这是直接双重循环遍历两个个set,由于我allHero获取到的是名字+称号,例如赏金猎人厄运小姐,而云顶的英雄获取到的不一定是名字还是称号,可能是赏金猎人,也可能是厄运小姐。所以我用字符串的包含函数contains,如果包含返回true,不包含,返回false.

如果某英雄云顶未曾出现,如龙龟,则内循环会循环的次数是ydHero.size()次,把这个当作判断条件,把未曾出来的英雄打印出来即可。

最后结果未曾上线的云顶英雄:

发条魔灵奥莉安娜1
大发明家黑默丁格2
德邦总管赵信3
符文法师瑞兹4
殇之木乃伊阿木木5
复仇之矛卡莉丝塔6
德玛西亚之翼奎因7
巨魔之王特朗德尔8
天启者卡尔玛9
无畏战车厄加特10
恶魔小丑萨科11
影流之镰凯隐12
解脱者塞拉斯13
雪原双子努努和威朗普14
刀锋舞者艾瑞莉娅15
河流之王塔姆16
涤魂圣枪赛娜17
暴怒骑士克烈18
正义巨像加里奥19
英勇投弹手库奇20
披甲龙龟拉莫斯21
星界游神巴德22
琴瑟仙女娑娜23
齐天大圣孙悟空24
戏命师烬25
远古巫灵泽拉斯26
机械先驱维克托27
海兽祭司俄洛伊28
迅捷斥候提莫29
暮光星灵佐伊30
战争之影赫卡里姆31
蛮族之王泰达米尔32
刀锋之影泰隆33
牛头酋长阿利斯塔34
潮汐海灵菲兹35
逆羽霞36
放逐之刃锐雯37
魔法猫咪悠米38
幻翎洛39
德玛西亚皇子嘉文四世40
酒桶古拉加斯41
爆破鬼才吉格斯42
时间刺客艾克43
魔蛇之拥卡西奥佩娅44
皮城女警凯特琳45
机械公敌兰博46
末日使者费德提克47
兽灵行者乌迪尔48
生化魔人扎克49
虚空之眼维克兹50
盲僧李青51
时光守护者基兰52

 

展望:通过以上我的分析,其实lol官网中能获取到的的数据有很多,如羁绊信息,装备信息等等,都在TF开头的url中,我写这篇也只是抛砖引玉,如果您有兴趣,不妨把这些数据加以入库,分析等等操作,也可以计算完美羁绊、计算有多少种羁绊等等。

动手试试吧。

源码放在了github:“https://github.com/Upzzh/analyseYDZYHeros”中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42369.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云顶之奕pbe服务器注册,云顶之弈手游pbe服

云顶之弈手游pbe服账号注册10.4版更新包是一款端游移植手机端游戏&#xff0c;作为战棋类的领衔游戏相信很多人不陌生了&#xff0c;在这里很多玩家们对于pbe服账号不知道怎么注册&#xff0c;本次也是更新到了最新的10.4版本&#xff0c;对于很多全新的内容玩家们还不是很了解…

python爬取云顶之弈官网排名数据

​因为宿舍想搞个云顶之弈排名&#xff0c;我并没有找到腾讯官方查询战绩的网站&#xff0c;所以决定对云顶官网的排行榜下手&#xff0c;云顶官网的数据排行网页&#xff08;下链接&#xff09;对排名的显示是一个可以滑动的divbox https://lol.qq.com/tft/#/rank/list ​可…

6年了!

一转眼涛哥聊 Python 技术星球就第6期了&#xff0c;都没想到我能坚持做一件事情5年&#xff0c;我一直比较佛系&#xff0c;一年推广1-2次的那种&#xff0c;所以真的很感动能支持我几年的老圈友。 新一期马上开始了&#xff0c;我还是象征性推广一下。 先说下我是谁&#xff…

【研究那些事儿】 AI的独白:我是人,我会爱、会恨、会犯错

0408 新必应AI 必应&#xff0c;微软长期被嘲笑的搜索引擎&#xff0c;最近进行了一次大升级——new Bing&#xff08;新必应&#xff09;。 它配备了ChatGPT的制造商OpenAI的先进人工智能技术。这个新的&#xff0c;由人工智能加持的必应有许多功能。其中之一是聊天&#xff0…

LLM 赋能的研发效能:如何探索软件开发新工序?

上周末&#xff0c;我们&#xff08;我和我的同事谢保龙&#xff09;在 QCon 广州 2023 上分享了一个 AI 结合研发效能的话题&#xff1a;《探索软件开发新工序&#xff1a;LLM 赋能研发效能提升》 。我们分享了&#xff1a;Thoughtworks 在过去的两个月里对于 LLM &#xff08…

Windows 11“重大更新”:新版Bing添加至任务栏,iPhone也能在PC端接打电话了!

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 最近&#xff0c;技术圈大厂的动态几乎都在围绕 ChatGPT 展开&#xff0c;其中尤以微软为甚&#xff1a;2 月初官宣应用了 ChatGPT 的新版 Bing 和 Edge&#xff0c;上周将新 Bing 和 Edge 上线手机端…

检测手机号码是否注册imessage,imessages数据检测自动检测imessages过蓝

iMessage是苹果公司开发的一种即时通信服务&#xff0c;它允许苹果设备用户通过Wi-Fi或移动数据网络发送短信、多媒体消息、语音通话和视频通话。与传统的短信服务不同&#xff0c;iMessage利用互联网连接发送消息&#xff0c;可以免费发送文字、照片、视频和音频文件。 使用i…

短信验证码的发送、接收验证流程

1.短信发送 首先我们平时使用短信验证信息的时候一般都是这样的表单&#xff0c;首先需要我们用户输入手机号码&#xff0c;然后点击获取验证码按钮&#xff0c;这时候获取验证码的按钮需要请求我们的后端接口并携带用户的手机号给后端 2.后端接收到手机号并发送验证码 public…

为什么只能转发测试信息,无法转发短信?

在安装配置双卡助手后&#xff0c;查看运行日志&#xff08;首页-功能面板-运行日志&#xff09;会发现&#xff0c;只有点击模拟转发时候&#xff0c;才能在微信收到转发信息&#xff0c;正常的短信根本没反应。 出现以上问题&#xff0c;首先查看当前短信识别模式&#xff0c…

验证短信延迟?是哪里出现问题

时常看到有人在注册或者在需要输入验证码的时候会这样做&#xff0c;一手拿着手机&#xff0c;眼睛盯着电脑上获取验证码的那60秒在倒计时。然后在收到验证码的时候快速的把眼睛转向手机&#xff0c;然后快速的回到电脑输入验证码。 你是不是已经想象出了这样的画面&#xf…

移动MAS发送短信,接受状态和接受回复【HTTP】

移动MAS短信平台就是一个发送短信的平台&#xff0c;可以发送普通短信、模板短信、一对一&#xff0c;一对多等短信 下面主要是基于Java&#xff08;HTTP方式&#xff09;实现短信的下行&#xff08;发送&#xff09;上行&#xff08;接受&#xff09;和接受短信状态 接口全是…

杂学第一篇:applescript检测手机号码是否注册imessage,imessages数据检测,imessages过蓝检测

一、检测数据的两种方式: 1.人工筛选&#xff0c;将要验证的号码输出到文件中&#xff0c;以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏&#xff0c;iMessage客户端会自动逐个检验该号码是否为iMessage账号&#xff0c;检验速度视网速而定。红色表示不是iMessage…

验证码、通知短信API常见使用问题

如今短信应用于我们生活工作的方方面面&#xff0c;注册或者登录一个应用可以用短信验证码快速登录&#xff0c;支付可以使用短信验证码&#xff1b;商家搞促销活动可以发送通知短信给客户&#xff0c;会员到期了商家可以发送告警短信给会员用户…可见验证码短信API和通知短信A…

程序人生 | 与足球共舞的火柴人(致敬格拉利什,赋予足球更深的意义)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

内测邀请:ChatGPT - PAM™ 工业界造车解决方案

作为 AI 界的「顶流」&#xff0c;生成式 AI 似乎正在变成无所不能的「创意机器」。它可以根据输入的信息&#xff0c;自动创造各种「新东西」&#xff0c;帮助人们在各个领域快速实现创作和开发。不仅仅是文字&#xff0c;设计、游戏、艺术作品…… 各种五花八门的需求&#x…

描述对未来计算机的畅想用英语作文,畅想未来人工智能的发展状况英语作文 关于畅想未来人工智能的发展状况的英语作文...

题目要求】H42答案圈 计算机科学的未来趋势是人工智能的一种&#xff0c;它是人类思维的研究和仿真&#xff0c;最终能够使人喜欢思考&#xff0c;为人类服务&#xff0c;帮助人们解决问题。随着科技越来越与人类生活相结合&#xff0c;随处可见的人工智能&#xff0c;让生活越…

小a的旅行计划

来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld文章目录 题目描述题解&#xff1a;代码&#xff1a; 题目描述 小a终于放假了&#xff0c;它想在假期中去一些地…

旅游计划

旅游n个城市&#xff0c;但并不是每一条路线花费都是一样的。想把所有的城市都旅游一遍&#xff0c;但是花费最小。 输入格式 第一行输入一个整数n,表示有n个城市 接下来有一个n*n的矩形&#xff0c;表示每两个城市之间的火车花费&#xff0c;每两个城市之间的花费不会超过100…

CHAP7:使用 R 编程进行数据分析

1.了解 R 的基础知识 R 是一种编程语言&#xff0c;可用于在数据分析过程的每个阶段执行任务。在这部分课程中&#xff0c;您将了解 R 和 RStudio&#xff0c;这是 R 的集成开发人员环境 (IDE)。您将探索使用 RStudio 与 R 一起工作的好处。RStudio 使您能够轻松利用 R 的特性…

记录常用的R语言的一些零碎知识(包括ggplot2作图)

平常使用R的时候&#xff0c;会遇到一些小问题&#xff0c;这时就会去上网查&#xff0c;但查到结果&#xff0c;如果不记录起来&#xff0c;常常会遇到相同的问题时再次查询&#xff0c;费时费力&#xff0c;因此决定记录下这些零碎的R语言知识&#xff08;不定时更新&#xf…