快捷搜索: 王者荣耀 脱发

Java用Jsoup爬取王者荣耀英雄图片

Jsoup

Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API, 可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup官网

王者荣耀

王者荣耀是是由腾讯游戏天美工作室群开发并运行的一款运营在Android、IOS、NS平台上的MOBA类国产手游。

爬取的网站

爬取分析

引入Jsoup依赖

<dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.13.1</version>
        </dependency>

对网站分析

去官网看网页源代码可知,英雄列表是在<ul class="herolist clearfix"></ul>这ul标签里,因此我们需要得到ul,然后再获取li。

代码如下

进一步分析网站你会发现,li里的图片都是小图,不清晰,当点击图片时会链接到该英雄的详情页面,我们应该获取这上面的图片

代码如下,其中获取到的详情页面地址是相对地址,得进行拼接

可以先输出pickName进行验证

详情页面

对详情页面进行分析,我们可以找到大图的位置,我们要获取的是这个图片地址,获取到图片地址后,接着IO读写把这些网络图片下载到本地即可。

浏览器打开图片地址,验证没问题

分析:

先获取class为zk-con1 zk-con的div,再获取style里的地址,再对地址进行截断拼接,最后用IO读这些网络图片,然后写入本地磁盘即可,这里我存入D盘下的javaSpider文件中,每个图片的命名用该英雄名字。

可先打印attrStyle,验证获取的style地址对不对

代码如下

/**
     * 下载图片
     *
     * @param path
     * @param pickName
     */
    private static void getPic(String path, String pickName) throws IOException {
        Connection conn = Jsoup.connect(path);
        Document doc = conn.get();
        Element elementDiv = doc.selectFirst("[class=zk-con1 zk-con]");
        String attrStyle = elementDiv.attr("style");
        //background:url(//game.gtimg.cn/images/yxzj/img201606/skin/hero-info/167/167-bigskin-1.jpg) center 0
        //截取字符串
        int start = attrStyle.indexOf("//") + 3;
        int end = attrStyle.lastIndexOf("");
        //截取后,game.gtimg.cn/images/yxzj/img201606/skin/hero-info/167/167-bigskin-1.jpg
        //String substring = attrStyle.substring(start, end);
        URL url = new URL("https://" + attrStyle.substring(start, end));
        //下载网络图片到本地
        //IO 输入流 读取
        BufferedInputStream in = null;
        BufferedOutputStream out = null;
        try {
            in = new BufferedInputStream(url.openStream());
            out = new BufferedOutputStream(new FileOutputStream(new File("D:\javaSpider\" + pickName + ".jpg")));
            byte[] b = new byte[1024];
            int len = -1;
            while ((len = in.read(b, 0, 1024)) != -1) {
                out.write(b, 0, len);
                out.flush();
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            in.close();
            out.close();
        }

    }

完整代码如下:

运行结果:

经验分享 程序员 微信小程序 职场和发展