java爬取图片

开发环境

  • IntelliJ IDEA Community Edition 2021.1.3

  • jdk1.8

Jsoup介绍

一款Java 的HTML解析器

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

爬取图片

分析

地址:https://pvp.qq.com/web201605/herolist.shtml

打开王者荣耀官网

按F12使用开发者工具检查元素

首先找到class="herolist clearfix"的ul标签

再找到对应英雄的li标签

其中a标签的文本内容就是该英雄的名字,a标签的href就是该英雄详细信息的相对位置

我们可以将a标签的相对位置获取下来在和"https://pvp.qq.com/web201605/"拼接一下获得该英雄详细信息的页面地址

在新获取的地址中继续按下F12进入开发者模式检查元素

其中class=zk-con1 zk-con的div标签中的style样式中的background属性中的地址即为背景图片地址。

以桑启英雄为例,该英雄图片地址为https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/545/545-bigskin-1.jpg

在网页中尝试访问一下

效果如下:

代码实现

  1. pom

  <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.15.3</version>
        </dependency>
 <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
  1. 使用jsoup获取网页代码

 @Test
    void contextLoads() {
        //用Java写一段爬虫程序
        /**
         * 思路:
         *  1、建立一个连接(主网址)
         *      https://pvp.qq.com/web201605/herolist.shtml
         *  2、找到一个ul标签对象(所有的li)
         *  3、for循环每一个li
         *     读取里面的a --- href
         *     根据href创建新连接
         *     背景图
         *  4、通过 I/O 读取 (下载到本地)
         */
        try {
            //1、建立一个连接(主网址)
            // https://pvp.qq.com/web201605/herolist.shtml
            String url = "https://pvp.qq.com/web201605/herolist.shtml";
            Connection connect = Jsoup.connect(url);
            //2、通过连接获取一个 Document 对象
            Document document = connect.get();
            //3、通过 Document 对象,寻找里面的一个UL对象, 的class属性的 herolist
            Element elementUL = document.selectFirst("[class = herolist clearfix]");
            //4、通过 Element 标签对象,寻找里面的一个LI对象
            Elements elementLis = elementUL.select("li");
            //5、遍历上面这个 elementLis 集合
            for (Element elementLi : elementLis) {  // <li></li>
                //想要得到li中的哪个 <a href = "路径">鬼谷子</a>连接元素  名字  路径
                Element elementA = elementLi.selectFirst("a");
                //得到<a href = "路径">xxx</a>中间的哪个文字-------英雄名字
                String HeroName = elementA.text();//英雄名称
                //得到 href 中的属性值
                //https://pvp.qq.com/web201605/herolist.shtml
                //herodetail/545.shtml
                String heroURL = elementA.attr("href");  //主要目的的路径
                //发现得到的 heroURL  是一个相对的路径,拼接绝对的路径
                //https://pvp.qq.com/web201605/herodetail/545.shtml
                String path = " https://pvp.qq.com/web201605/" + heroURL;  //拼接英雄详细信息网页地址

                //根据这个path路径,去创建一个新的连接 (相当于,点击了)
                Connection newConnection = Jsoup.connect(path);
                //根据新的连接,获取新的Document 对象
                Document newDocument = newConnection.get();
                //通过新的Document获取一个div
                // <div class="zk-con1 zk-con">
                Element elementDiv = newDocument.selectFirst("[class=zk-con1 zk-con]");
                //获取这个div中的 style 属性值
                // style = "background:url('//game.gtimg.cn/images/yxzj/img201606/skin/hero-info/545/545-bigskin-1.jpg') center 0"
                String backgroundURL = elementDiv.attr("style");//获取英雄图片地址
                int length = backgroundURL.length();
                System.out.println("长度:"+length);
                //找寻 两个单引号的位置
                int left = backgroundURL.indexOf("'");
                System.out.println(left);
                int right = backgroundURL.lastIndexOf("'");
                System.out.println(right);
                String newBG = backgroundURL.substring(left + 1, right);
                URL newUrl = new URL("https:" + newBG);

                System.out.println("地址:"+newUrl);

                //以上的部分就是将网站上的一些标签做了一个分析
                System.out.println("下载:"+HeroName);


                // 输出流,读取刚才的  newUrl 路径对应的图片
                InputStream is = newUrl.openStream();
                // 输出流,写到我们的本地的硬盘上
                String newPath = "C://desk/爬取图片/"+HeroName+".jpg";

                FileOutputStream fos = new FileOutputStream(newPath);//写入path文件夹

                //下载图片
                IOUtils.copy(is, fos);
                fos.close();
                is.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

效果

搞定啦!喜欢的点个赞支持一下。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值