网络爬虫之王者荣耀会

因为需要,所以创造。 ——某开源社区


喜欢玩手游的朋友们应该都玩过某讯的王者农药,鄙人作为一个手游渣渣也玩过几次,常用英雄为亚瑟、安琪拉、鲁班…。玩几局就被其中每个英雄唯美的UI设计所吸引(但是最常玩还是射击类游戏,有喜欢玩的可以关注私聊我呦),但是对所有的英雄的荣耀并不太了解。所以为了了解每个英雄的典故,我从昨天10点到次日2点,撸代码撸出了这个开源程序(因为需要,所以创造

说说这个程序

模块和技术栈

首先这个程序主要包括两个部分,分别是数据抓取和处理数据展示。主要使用的技术栈为:

  • Java8
  • Okhttp (应用层)
  • Jsoup (数据解析)
  • JSP+CSS(界面有点丑,哈哈)
看一下实际效果(哈哈,真丑)
看看实现核心代码吧

接口

// 解析
public interface Parser {void parser() throws ExecutionException, InterruptedException;
}
// 抓取
public interface Crawler<T,R> {String doGet(String uri, Map<T,R> headers);default void setHttpHeaders(Request.Builder builder, Map<T,R> headers){if(headers == null || headers.isEmpty()){return ;}for(Map.Entry<T,R> entry : headers.entrySet()){builder.addHeader(String.valueOf(entry.getKey()),String.valueOf(entry.getValue()));}}
}

抓取公共方法

public class HttpCrawler implements Crawler<String,String> {private OkHttpClient httpClient = new OkHttpClient();private static HttpCrawler instance = new HttpCrawler();@Overridepublic String doGet(String uri, Map<String,String> headers) {assert uri != null;Request.Builder httpBuilder = new Request.Builder();// 设置请求头部setHttpHeaders(httpBuilder,headers);Request request = httpBuilder.url(uri).build();Response response;String page = "";try{response = httpClient.newCall(request).execute();if(!response.isSuccessful()){throw new HttpStatusException(http_error.getMsg(),response.code(),uri);}ResponseBody responseBody = response.body();if(Objects.nonNull(responseBody)){byte[] bytes = responseBody.bytes();page = new String(bytes,Charsets.GB2312.name());}} catch (IOException e) {e.printStackTrace();}return page;}public static HttpCrawler getInstance() {return instance;}
}

解析英雄

public class KingParser implements Parser {private static KingParser kingParser = new KingParser();private StoryParser storyParser = StoryParser.getInstance();private String page;private List<Hero> heros = new ArrayList<>();private ExecutorService executors = Executors.newCachedThreadPool(new ThreadFactory() {AtomicInteger integer = new AtomicInteger();@Overridepublic Thread newThread(@NotNull Runnable r) {return new Thread(r,"parser-thread-"+integer.getAndIncrement());}});@Overridepublic void parser() throws ExecutionException, InterruptedException {Document document = Jsoup.parse(page);if(document == null || StringUtils.isEmpty(document.body().html())){return;}Elements heroBox = document.getElementsByClass(WebAppConfig.kingClassName);Elements heroLists = heroBox.get(0).getElementsByTag(li.name());long start;System.out.println("开始时间==="+(start=System.currentTimeMillis()));AtomicInteger count = new AtomicInteger();for(Element element : heroLists){Hero hero = new Hero();count.getAndIncrement();Future<Object> submit = executors.submit(() -> {Elements aTag = element.getElementsByTag(a.name());String uri = WebAppConfig.baseUri + aTag.attr(href.name());hero.setDetail(parserStory(uri));hero.setHero(aTag.get(0).getElementsByTag(img.name()).get(0).attr(alt.name()));hero.setPicture("http:" + aTag.get(0).getElementsByTag(img.name()).get(0).attr(src.name()));return hero;});heros.add((Hero) submit.get());}//4922System.out.println("结束时间==="+(System.currentTimeMillis()-start));System.out.println("共抓取:"+count.get());}public static KingParser getInstance(){return kingParser;}private String parserStory(String uri){storyParser.setUri(uri);storyParser.parser();return storyParser.getStory();}public void setPage(String page) {this.page = page;}public List<Hero> getHeros(){if(CollectionUtils.isEmpty(heros)){try {parser();} catch (ExecutionException | InterruptedException e) {e.printStackTrace();}}return heros;}
}

解析故事

public class StoryParser implements Parser{private String uri;private String story;private HttpCrawler httpCrawler = HttpCrawler.getInstance();private static StoryParser storyParser = new StoryParser();@Overridepublic void parser() {String detailPage = httpCrawler.doGet(uri, null);Document parse = Jsoup.parse(detailPage);Element heroStory = parse.getElementById("hero-story");Element element = heroStory.getElementsByClass("pop-bd").get(0);story = element.html();}public String getStory() { return story; }public void setUri(String uri) { this.uri = uri; }public static StoryParser getInstance() { return storyParser; }
}
代码还有需要优化的地方
  • 缓存:每次处理都需要多次请求解析,可以使用缓存替代。
  • 界面:界面不够美观,可以使用Javascript和CSS3进行页面动态化。

Github欢迎提issue

Github地址

关注我

网络爬虫之王者荣耀会相关推荐

  1. 手把手教你使用Python网络爬虫获取王者荣耀英雄皮肤

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 欢度国庆,共度中秋. /1 前言/ ...

  2. python爬虫下载王者荣耀图片

    python爬虫下载王者荣耀图片 腾讯课堂白嫖的一堂课,大佬勿喷. import requests import jsondata = requests.get('http://pvp.qq.com/ ...

  3. 爬虫获取王者荣耀全英雄皮肤

    爬虫获取王者荣耀全英雄皮肤 # coding=utf-8import os,requests,shutil""" 王者荣耀全英雄皮肤 """ ...

  4. Python爬虫下载王者荣耀全皮肤

    python爬虫下载王者荣耀全皮肤 import requests import os from time import timestart = time() headers = {'User-Age ...

  5. 利用Python爬虫下载王者荣耀教学视频

    前言: 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我给 ...

  6. python爬虫源码_Python—爬虫:王者荣耀全套皮肤【附源码】

    怎么获取全套皮肤?用钱买,或者用爬虫爬取下来~虽然后者不能穿.这个案例稍微复杂一点,但是一个非常值得学习的项目. 具体实现思路: 分析网页源代码结构 找到合适的入口 穷举访问并解析 爬取所有英雄所有皮 ...

  7. python爬虫入门------王者荣耀英雄及皮肤数据爬取项目

    王者荣耀英雄及皮肤数据爬取项目 一:做前需知 笔者这段学习了一些爬虫的知识,然后做了一个小项目.接下来,我会把项目的流程展示出来. 运行环境:python 3.6.3.pycharm 2019-3-3 ...

  8. 爬虫案例 王者荣耀 皮肤壁纸下载

    代码 import urllib.request import json,sys,os ''' 函数功能 - 使用进度条 parameter - 下载的条数 ''' m=0 k=0 def down_ ...

  9. python 爬虫提取王者荣耀英雄皮肤

    仅供学习参考 import os import requestsurl = 'https://pvp.qq.com/web201605/js/herolist.json' herolist = req ...

最新文章

  1. 有关任意多条曲线的拟合度算法
  2. 为什么建议使用你 LocalDateTime ,而不是 Date?
  3. C语言入门练习 - 第二期 判断语句与循环语句(题解)
  4. Replica Sets+Sharding方案之真枪实弹篇
  5. N Problems During K Days
  6. 清远工贸职业技术学校清远大学城网
  7. c 语言中out的作用,C语言outData+是什么意思做什么用?
  8. [BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线
  9. vue 圆形 水波_vue 开发波纹点击特效组件
  10. 5G时代商业逻辑的五大思考
  11. C# 实现系统关机、注销、重启、休眠、挂起
  12. 利用JavaScript实现京东自动叠蛋糕+淘宝自动领喵币,叠列车+618全民购物
  13. 干货---ARCGIS拓扑规则说明详细讲解
  14. 使用JavaMail发送普通邮件(纯文本邮件)
  15. 通信原理 | 信道容量
  16. vue结合vue-amap调用高德地图行政区划分并添加标记点
  17. 各层电子数排布规则_电子数的排布规律
  18. 酷派android4.4.4到5.0,酷派大神F2和大神F1安卓5.0系统升级将到来
  19. DSP28335:EPWM
  20. STM32之串口的使用

热门文章

  1. 短视频/直播+教育成为教育新常态
  2. 《深入理解高并发编程:JDK核心技术》-冰河新书上市
  3. 第2章第30节:英文排版技巧:固定值在文字排版中的灵活应用 [PowerPoint精美幻灯片实战教程]
  4. 高频电子线路——分频网络
  5. php开发新手的一些建议
  6. 一些我推荐的学习资料网站
  7. Python数据可视化——matplotlib.pyplot中plt的参数详解
  8. 【机器学习】《动手学深度学习 PyTorch版》李沐深度学习笔记(Alexnet)
  9. 栈外h5跳转app,否则跳商城下载
  10. Paraview 软件学习