【爬虫】自动下载指定网站全部图片(Java版)

爬虫是一种自动化程序,能够模拟人类的浏览行为,访问网络资源并提取所需数据。它可以通过发送HTTP请求获取网页内容,并对网页进行解析和数据提取。

在大多数时候,提到爬虫我们就会想到 Python,其实 Java 也是可以实现爬虫的。

Java提供了很多网络编程相关的类库,但为了方便我们编写爬虫程序,可以引入一些第三方库,如HttpClient、Jsoup等。这些库提供了更简洁、易用的接口,帮助我们快速实现爬虫功能。 

Tips:

  • 下方代码中的网址请自行更替
  • 图片下载到指定文件夹,文件夹需要是存在的
  • 图片名称(前缀)可以自定义,程序会自动编号
  • 本项目使用 Maven 管理依赖,若是不使用 Maven 则需要自行下载 jsoup 的 jar 包

pom 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>JavaCrawler</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--Java网络爬虫工具--><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version></dependency></dependencies></project>

 完整代码: 

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;/*** 爬取指定网址上的图片** Tips:* 若出现 403 错误则可能是由于“写入”访问被禁止而造成的,* 当试图将文件上载到目录或在目录中修改文件,但该目录不允许"写"访问时就会出现此种错误** @author 秋玄* @version 1.0* @since 1.0*/
public class App {public static void main(String[] args) {// 网站地址String site = "https://xxx.xx.com/";// 图片保存路径String filePath = "F://test";// 自定义图片名称String fileName = "img";downloadImg(site,filePath,fileName);}/*** 获取指定网站上所有图片* @param website       指定网站的完整域名 包括请求协议,例如:www.xxx.com* @param filePath      图片存放路径 例如:F://test* @param fileName      图片名称 例如:xxx*/private static void downloadImg(String website,String filePath,String fileName) {List<String> urlList = new ArrayList<>();try {// 获取网站图片的 src// 连接到指定网站Connection connection = Jsoup.connect(website);// 获取网站页面上所有的 DOM 元素Document document = connection.get();// 获取所有的 img 元素Elements imgs = document.getElementsByTag("img");// 遍历 imgsfor (int i = 0; i < imgs.size(); i++) {// 获取 img 元素的 src 属性String src = imgs.get(i).attr("src");// url地址以 “//” 开始,需要拼接请求协议if (src.startsWith("//")){src = "https:" + src;}// 路径为 空 或 “about:blank” 则不添加到 List 中if (src.length() != 0 && !"about:blank".equals(src)) {urlList.add(src);}// 下载图片getImg(urlList,filePath,fileName);}} catch (IOException e) {throw new RuntimeException(e);}}/*** 下载指定 URL 的图片* @param imgURL        图片地址的 list 集合* @param filePath      图片存放路径* @param fileName      图片文件名称*/private static void getImg(List<String> imgURL,String filePath,String fileName){InputStream in = null;FileOutputStream fos = null;// 遍历图片地址 list 集合for (int i = 0; i < imgURL.size(); i++) {try {URL url = new URL(imgURL.get(i));in = url.openStream();// 拼接文件存放路径及文件名String path = appendPath(filePath,fileName,i);// 将图片写入本地fos = new FileOutputStream(path);byte[] bytes = new byte[1024];int count = in.read(bytes);while(count != -1){fos.write(bytes,0,count);fos.flush();count = in.read(bytes);}} catch (IOException e) {throw new RuntimeException(e);}finally {// 释放资源if (in != null) {try {in.close();} catch (IOException e) {throw new RuntimeException(e);}}if (fos != null) {try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}}}}/*** 拼接文件存放路径及文件名* @param filePath      文件路径* @param fileName      文件名* @param i             文件编号* @return              文件完整路径* 格式:文件路径 + 文件名称 + _ + 文件编号 + 文件后缀(.jpg)*/private static String appendPath(String filePath,String fileName,Integer i) {return filePath + "//" + fileName + "_" + (i + 1) + ".jpg";}
}

 

一  叶  知  秋,奥  妙  玄  心

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断完数(写出部分函数)

例如&#xff1a;本题要求实现一个函数&#xff0c;判断一个自然数是否是完数。如果一个自然数除自身之外的因子和等于它自己&#xff0c;则称该数为完数。例如 6 1 2 3&#xff1b;则6是完数。 函数接口定义&#xff1a; 在这里描述函数接口。&#xff1a;int isPerfect (…

ApplicationContextAware 类

优质博文&#xff1a;IT-BLOG-CN 需求&#xff1a; 使用autowired注入一些对象&#xff0c;但发现不可以直接使用Autowired&#xff0c;因为方法是static的&#xff0c;要使用该方法当前对象也必须是static&#xff0c;正常情况下Autowired无法注入静态的bean&#xff0c;于是…

数据结构与算法编程题44

有向无权图邻接矩阵表示 //参考博客&#xff1a;https://blog.csdn.net/qq_54162207/article/details/117414707#include <iostream> using namespace std;#define Maxsize 100 #define VertexmMaxNum 20 #define ERROR 0 #define OK 1 typedef string VertexType; …

img标签禁止右键点击复制图片等功能

场景描述&#xff1a;在网页中显示图片&#xff0c;但是不想让其他人右键保存图片 会用到一个新的属性&#xff1a;oncontextmenu 代码如下 <img src"./123.png" alt"" oncontextmenu"return false">这样虽然能解决不在当前页右键保存图片…

微信玩具小程序商城开发技巧

小程序已成为许多企业和个人开展业务的重要工具之一。如果你想在玩具行业中打造一个小程序商城&#xff0c;但又没有相关的编程经验&#xff0c;不用担心&#xff01;本文将通过乔拓云平台提供的简单操作步骤&#xff0c;分享给你玩具行业小程序平台搭建的教程。 首先&#xff…

DriveWorks——参数化设计非标定制利器

DriveWorks基本介绍 DriveWorks是一套被 SOLIDWORKS 认可为金牌合作伙伴产品的设计自动化软件。DriveWorks 可自动创建特定于订单的销售文档和 SOLIDWORKS 制造数据。减少重复性任务&#xff0c;消除错误&#xff0c;增加销售额&#xff0c;并在创纪录的时间内交付定制产品。 为…

Linux下的查看文件的命令

1. tail 命令 tail 命令是在 Linux 和类 Unix 系统上用来显示文件末尾内容的命令。它最常用于查看文件的末尾几行内容&#xff0c;通常在日志文件或其他不断更新的文件中使用。 以下是 tail 命令的常用选项和用法&#xff1a; 1.1. 基本用法 tail file_name这将默认显示文件…

python的异常处理批量执行网络设备的巡检命令

前言 在网络设备数量超过千台甚至上万台的大型企业网中&#xff0c;难免会遇到某些设备的管理IP地址不通&#xff0c;SSH连接失败的情况&#xff0c;设备数量越多&#xff0c;这种情况发生的概率越高。 这个时候如果你想用python批量配置所有的设备&#xff0c;就一定要注意这…

top K问题(C语言)

目录 前言 top K问题 模拟数据 建堆 验证&#xff08;简单了解即可&#xff09; 最终代码 调试部分 前言 在大小堆的实现&#xff08;C语言&#xff09;中我们讨论了堆的实际意义&#xff0c;在看了就会的堆排序&#xff08;C语言&#xff09;中我们完成了堆排序&#…

Java利用UDP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名。 二、实现代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String; public class liaotian extends JFrame{ pri…

找丢失号码(桶排序)

题目&#xff1a;小明拿着本院100名校运会选手的号码牌走向操场&#xff0c;号码是101到200.出于道路施工加上下雨&#xff0c;小明摔跤后将号码牌散落在地&#xff0c;小明捡起来发现只有99张号码牌&#xff0c;请你编程帮小明快速找到是什么号码丢失 #include <stdio.h>…

【13】PyQt多线程多任务管理

目录 多线程&多任务介绍 多线程管理 1. 拷贝依赖 2. 使用示例 多任务管理 1. 拷贝依赖 2. 使用示例 多线程&多任务介绍 多线程&多任务通常是指将一个任务或多个任务运行在子线程&#xff0c;并且子线程可以独立启动&#xff0c;或通过线程池启动。子线程通…

深度探索 Python Pyramid 框架

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Pyramid是一个灵活且强大的Python web框架&#xff0c;广泛用于构建各种规模的Web应用程序。本文将深度探索Pyramid框架&#xff0c;介绍其核心概念、应用场景以及一些高级特性。 安装与基础用法 首先&#xf…

JS学习--类型转换

函数转换 parseInt() 转换之前&#xff0c;首先会分析该字符串。判断位置为0处的字符串&#xff0c;判断是否为有效数字&#xff0c;若否&#xff0c;直接返回NaN&#xff0c;不再继续&#xff1b; 若是&#xff0c;继续打印直到不为数字的地方停止 parseFloat() 转换之前&…

linux日志优先级

7种日志级别代号0-7 0 debug #有调试信息的&#xff0c;日志信息最多 1 info #一般信息的日志&#xff0c;最常用 2 notice #最具有重要性的普通条件的信息 常见 3 warning #警告级别 常见 4 …

探索鸿蒙 DevEcoStudio汉化+运行报错

在下载好软件&#xff0c;摸索着成功创建了一个项目的时候&#xff0c;点击运行&#xff0c;竟然失败了。而且一大堆的英文也不知道从何入手&#xff0c;从网上搜了一下&#xff0c;找到了汉化的办法&#xff0c;并且解决了问题。我这里走的是Mac的步骤&#xff0c;微软的其实一…

ReadWriteLock 和 StampedLock 的比较与解析

在多线程编程中&#xff0c;我们经常需要使用锁来保证同一时刻只有一个线程能够访问共享资源。Java提供了多种锁的实现&#xff0c;如ReentrantLock、ReadWriteLock、StampedLock等。本文将对ReadWriteLock和StampedLock进行比较&#xff0c;分析它们的原理、优缺点&#xff0c…

SpringBoot3-实现和注册拦截器

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

安卓https抓包(提供软件+视频)

遇到的问题 因为android7.0以上机制不在信任用户证书&#xff0c;导致https协议无法抓包&#xff0c;除非把证书装在系统信任的证书里&#xff0c;此时手机需要root权限&#xff0c;但是如何不需要手机root也能抓包成功呢&#xff1f;我们采用virtualxposedjusttrustme来解决&…

图灵测试:人工智能的终极挑战

图灵测试&#xff1a;人工智能的终极挑战 一、引言 在人工智能的发展历程中&#xff0c;图灵测试一直被视为一个重要的里程碑。这个由英国计算机科学家艾伦图灵提出的实验&#xff0c;旨在评估人工智能是否能够像人一样思考和表达&#xff0c;为人类与机器智能之间的界限设立了…