java实现图片爬取

开发环境

IntelliJ IDEA  2021.1.3

jdk1.8

Jsoup介绍

一款Java 的HTML解析器

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于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>

2.使用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();
        }
 
    }

效果

图片

图片

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SPI子系统

IO特性 SPI接口一般使用四条信号线通信&#xff1a; SDI&#xff08;数据输入&#xff09;&#xff0c;SDO&#xff08;数据输出&#xff09;&#xff0c;SCK&#xff08;时钟&#xff09;&#xff0c;CS&#xff08;片选&#xff09; MISO&#xff1a; 主设备输入/从设备输出…

服装|基于Java+vue的服装定制系统(源码+数据库+文档)

服装定制系统 目录 基于Javavue的服装定制系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布…

【PPT】文字突然变成方框

文章目录 前言一、问题描述二、解决方案参考文献 前言 在 ppt 画图时遇到的问题 一、问题描述 在 ppt 使用过程中&#xff0c;同一字体&#xff0c;有些变成了方框&#xff0c;有些没有变&#xff08;排除字体缺失问题&#xff09; 二、解决方案 如果是页数多了&#xff0…

MyEclipse2020安装教程(图文)

本章教程主要记录如何在Windows上安装MyEclipse2020.。 一、下载安装包 通过网盘分享的文件&#xff1a;Myeclipse 2020.rar 链接: https://pan.baidu.com/s/1fD2P0S0GU_zJlUHTPeXP-A?pwdv71m 提取码: v71m 二、安装步骤 1、打开解压后的文件夹&#xff0c;鼠标右击【myeclip…

Linux日志-日志小结

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

基于C#的UDP协议消息传输

1. 服务端 internal class Program{static void Main(string[] args){//1.创建SocketSocket socketServer new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//2.绑定IP、端口号EndPoint endPoint new IPEndPoint(IPAddress.Parse("127.0.0.1&…

【Qt】实现一个小闹钟

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton>//按钮类 #include <QLineEdit>//行编辑器 #include <QLabel>//标签类 #include <QTextEdit>//输入框 #include <QTimerEvent>//定时器事件类 #inc…

StorageSync数据缓存API

uni.setStorageSyncs参数:将 data 存储在本地缓存中指定的 key 中&#xff0c;会覆盖掉原来该 key 对应的内容&#xff0c;这是一个同步接口。 uni.setStorageSync函数里面写两个参数,分别是key和值,两个参数名称可以随便取,如果有同名的key,那么后面key的值会覆盖掉前面key的值…

详解BMP图片格式以及关于Verilog图像处理的仿真环境搭建

文章目录 一、BMP位图简介二、BMP格式分析2.1 如何用十六进制打开BMP图片2.2 头文件格式2.3 信息头格式2.4 调色板格式2.5 位图数据格式2.6 位图对齐方式三、Verilog图像处理的仿真环境搭建3.1 Verilog文件操作指令3.1.1 条件编译 (`` `ifdef``、 `` `else``、`` `endif``)3.1.…

在ATECLOUD中如何修改原有电源自动测试系统中的测试方案?

对于大多数电源自动测试系统而言&#xff0c;已经完成定型的电源模块测试方案想要重新修改难度非常的大&#xff0c;除非电源生产企业将整个系统返厂回电源自动测试系统的生产商&#xff0c;否则很难自己调整修改内部的项目和方案&#xff0c;而电源自动测试系统的生产商对原有…

spring自动装配

spring自动装配 Spring 框架提供了一种机制&#xff0c;称为自动装配&#xff08;Autowired&#xff09;&#xff0c;它允许 Spring 容器自动将依赖注入到 Bean 中&#xff0c;而无需显式地使用 XML 配置文件或构造函数注入。自动装配简化了依赖注入的过程&#xff0c;使得代码…

element-ui打包之后图标不显示,woff、ttf加载404

1、bug 起因 昨天在 vue 项目中编写 element-ui 的树形结构的表格&#xff0c;发现项目中无法生效&#xff0c;定位问题之后发现项目使用的 element-ui 的版本是 2.4.11 。看了官方最新版本是 2.15.14&#xff0c;然后得知 2.4.11 版本是不支持表格树形结构的。于是决定升级 el…

云曦2024秋季开学考

ezezssrf 第一关&#xff1a;md5弱比较 yunxi%5B%5D1&wlgf%5B%5D2 第二关&#xff1a; md5强比较 需要在bp中传参&#xff0c;在hackbar里不行 yunxiiM%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DC V%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_B…

OFDM信号PARP的CCDF图

文章目录 引言代码代码疑难解答参考文献 引言 本书主要参考了文献1&#xff0c;但实际上该书中符号和表述的错误非常多&#xff08;只能说棒子是这样的&#xff09;&#xff1b;同时因为发表时间的关系&#xff0c;很多MATLAB代码进行了更新&#xff0c;原书提供的代码已经无法…

【计算机网络】UDP TCP介绍

UDP & TCP介绍 UDP报文格式报文内容介绍端口号报文长度校验和载荷 TCP报文格式初步了解TCP机制确认应答超时重传连接管理滑动窗口流量控制拥塞控制紧急传输数据推送延时应答捎带应答面向字节流异常处理心跳机制 UDP 和 TCP 的区别 UDP 报文格式 对于网络协议, 本质上就是…

STM32+ESP8266+MQTT协议连接阿里云实现温湿度上传

前期步骤: ESP8266下载固件→连接阿里云-CSDN博客 keil文件&#xff1a;大家可以直接下载&#xff0c;也可以在后台私信我获取 《STM32ESP8266MQTT协议连接阿里云实现温湿度上传》 keil文件源码 一、代码修改部分 1、mqtt.h文件中的修改 2、wifi.h文件中的修改 3、main.…

国庆出行要准备什么?这款骨传导耳机你一定不能错过!

在准备国庆假期的旅行计划时&#xff0c;大家可能正在考虑如何让旅途更加充实有趣&#xff0c;同时也注重个人健康和舒适度。选择一款适合旅行的耳机&#xff0c;不仅是对音乐品味的追求&#xff0c;更是对旅途品质的提升。 今天&#xff0c;我想给大家推荐一款我个人非常喜欢的…

局域网一套键鼠控制两台电脑(台式机和笔记本)

服务端&#xff08;有键盘和鼠标的电脑作为服务端&#xff09; 下载软件 分享文件&#xff1a;BarrierSetup-2.3.3.exe 链接&#xff1a;https://pan.xunlei.com/s/VO66rAZkzxTxVm-0QRCJ33mMA1?pwd4jde# 配置服务端 一&#xff0c; 二&#xff0c; 客户端屏幕名称一定要和…

物联网之PWM呼吸灯、脉冲、LEDC

MENU 前言原理硬件电路设计软件程序设计analogWrite()函数实现呼吸灯效果LEDC输出PWM信号 前言 学习制作呼吸灯&#xff0c;通过LED灯的亮度变化来验证PWM不同电压的输出。呼吸灯是指灯光在单片机的控制之下完成由亮到暗的逐渐变化&#xff0c;感觉好像是人在呼吸。 原理 脉冲宽…

网络学习-eNSP配置单交换机VLAN

VLAN 隔离广播域增加安全提高带宽利用降低数据传递延迟 实验1-设置单交换机VLAN #VLAN 1 表示默认VLAN&#xff0c;默认所有主机在VLAN1 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information cen…