//记录一下,防止重写

import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import net.minidev.json.JSONUtil;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
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.util.EntityUtils;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.logging.LogManager;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetLolPosters {
    public static void main(String[] args) throws IOException {

        LogManager.getLogManager().reset();//加上这条语句隐藏HtmlUnit执行后的报错信息

        String url = "https://lol.qq.com/data/info-heros.shtml";

        WebClient webClient = new WebClient();
        HtmlPage page = null;
        try {
            page = webClient.getPage(url);//尝试加载网页
            //异步JS执行需要耗时,这里线程要阻塞300ms,等待异步JS执行结束
            webClient.waitForBackgroundJavaScript(300);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            webClient.close();
        }

        System.out.println(page.asXml());
        //获取html文档
        Document document = Jsoup.parse(page.asXml());
        //获取英雄列表,不使用WebClient会导致列表加载不全
        Element elementUl = document.selectFirst("[class=imgtextlist]");
//        System.out.println(elementUl);
        //通过ul标签找到它下面所有的li子标签,根据标签名查找
        Elements elementLis = elementUl.select("li");
        System.out.println(elementLis);
        System.out.println("第一个页面已分析好");

        int size1 = 0;//记录英雄个数
        int size2 = 0;//记录图片个数
        for (Element elementLi : elementLis) {
            size1++;//一个循环为一个英雄
            //选中a标签
            Element elementA = elementLi.selectFirst("a");
            // 获取a标签中的href属性值储存着该英雄的页面地址
            String href = elementA.attr("href");//获取标签中的属性值
            String heroName = elementA.attr("title");//获取英雄名字,用来做文件夹名
            String[] ids = href.split("=");
            System.out.printf(ids[1]);

            String netPath = "https://lol.qq.com/data/" + href;
            //很不幸,英雄皮肤列表也是动态加载
            //所以只能按固定地址下载第一张照片
            String str = "https://game.gtimg.cn/images/lol/act/img/skin/big" + ids[1] + "000.jpg";
            System.out.println("正在下载" + str);
            URL url2 = new URL(str);
            InputStream inputStream = url2.openStream();
            FileOutputStream fileOutputStream = new FileOutputStream("D://英雄联盟//" + size1 + heroName + ".jpg");

            //需要创建一个byte数组
            byte[] b = new byte[1024];
            //读取到的数据临时存放在b字节数组内
            int count = inputStream.read(b);//count 指的是读取的有效字节个数
            while (count != -1) {
                fileOutputStream.write(b, 0, count);

                fileOutputStream.flush();

                count = inputStream.read(b);
            }
            fileOutputStream.close();
            inputStream.close();
            size2++;//记录总共下载的图片个数
        }
        System.out.println("结束,共有" + size1 + "个英雄," + size2 + "张照片");

    }
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论