实现网络图片爬虫,只需5秒快速把整个网页上的图片全下载打包zip

简介: 我们经常需要用到互联网上的一些共享资源,图片就是资源的一种,怎么把网页上的图片批量下载下来?有时候我们需要把网页上的图片下载下来,但网页上图片那么多,怎么下载我们想要的东西呢,如果这个网页都是我们想要的图片,难道我们要一点一点一张一张右键下载吗? 当然不好,这里提供一段Java实现的网络爬虫抓图片代码,程序员同志有喜欢的记得收藏哦, 材料:必须会java开发,用到的核心jar Jsoup自己去网上下载很多。

我们经常需要用到互联网上的一些共享资源,图片就是资源的一种,怎么把网页上的图片批量下载下来?有时候我们需要把网页上的图片下载下来,但网页上图片那么多,怎么下载我们想要的东西呢,如果这个网页都是我们想要的图片,难道我们要一点一点一张一张右键下载吗? 当然不好,这里提供一段Java实现的网络爬虫抓图片代码,程序员同志有喜欢的记得收藏哦,

这个工具我已经发布了,地址就是:http://www.yzcopen.com/img/imgdown

材料:必须会java开发,用到的核心jar Jsoup自己去网上下载很多。

以下是我已经实现的界面化的抓取图片的在线工具,有兴趣的朋友可以按照图片地址打开看看

实现网络图片爬虫,只需5秒快速把整个网页上的图片全下载打包zip

下图是抓取效果网络上随便找第一个美女图片网站

实现网络图片爬虫,只需5秒快速把整个网页上的图片全下载打包zip

实现网络图片爬虫,只需5秒快速把整个网页上的图片全下载打包zip

这个是要抓取的网站的主界面:


这里是抓取的结果已经到我本地电脑了


下面是实现代码:

/**

*模拟用户请求

*/

public final static String UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400

QQBrowser/10.3.3040.400";

/*

*

*抓取全部图片地址 备注:zfilepath是zip文件路径 url是网页地址 pp是img的其中属性一般是src即可

*/

public static boolean getImgSrc(String zfilepath,String url,String pp){

boolean isb =false;

// 利用Jsoup获得连接

Connection connect = Jsoup.connect(url).timeout(5000);

connect.header("Connection", "Keep-Alive");

connect.header("Content-Type", "application/x-www-form-urlencoded");

connect.header("Accept-Encoding", "gzip, deflate, sdch");

connect.header("Accept", "*/*");

connect.header("User-Agent",Const.UserAgent);

ZipOutputStream out = null;

try {

// 得到Document对象

Document document = connect.ignoreContentType(true).timeout(5000).get();

// 查找所有img标签

Elements imgs = document.getElementsByTag("img");

File zipfile = new File(zfilepath);

out=new ZipOutputStream(new FileOutputStream(zipfile));

int i=1;

List<String> listimg = new ArrayList<String>();

for (Element element : imgs) {

//获取每个img标签URL "abs:"表示绝对路径

String imgSrc = element.attr("abs:"+pp);

listimg.add(imgSrc);

}

listimg = removeCf(listimg);

if(listimg!=null && listimg.size()>0){

for(int x=0;x<listimg.size();x++){

long stime = System.currentTimeMillis();

String imgSrc =listimg.get(x);

// 打印URL

System.out.println(imgSrc);

//下载图片到本地

boolean is = downImages(imgSrc,out);

long etime = System.currentTimeMillis();

float alltime = (float)(etime - stime)/1000;

Map<String,String> rest = new HashMap<String,String>();

rest.put("img",imgSrc);

rest.put("time",(alltime)+"");

rest.put("num",i+"");

rest.put("status","true");

if(is){

rest.put("http","成功");

}else{

rest.put("http","失败");

}

i++;

}

Map<String,String> rest1 = new HashMap<String,String>();

rest1.put("status","true");

rest1.put("msg","打包完成");

System.out.println("下载完成");

isb =true;

}else{

Map<String,String> rest1 = new HashMap<String,String>();

rest1.put("status","true");

rest1.put("msg","未抓取到数据,有可能反爬虫了");

client.sendEvent("chatevent", rest1);

}

} catch (IOException e) {

e.printStackTrace();

Map<String,String> rest = new HashMap<String,String>();

rest.put("status","false");

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

if(out!=null){

out.close();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return isb;

}

/**

* 下载图片到指定目录

*

* @param filePath 文件路径

* @param imgUrl 图片URL

*/

public static boolean downImages(/*String filePath,*/ String imgUrl,ZipOutputStream outStream) {

boolean is = false;

// 若指定文件夹没有,则先创建

/* File dir = new File(filePath);

if (!dir.exists()) {

dir.mkdirs();

}*/

// 截取图片文件名

String fileName = imgUrl.substring(imgUrl.lastIndexOf('/') + 1, imgUrl.length());

try {

// 文件名里面可能有中文或者空格,所以这里要进行处理。但空格又会被URLEncoder转义为加号

String urlTail = URLEncoder.encode(fileName, "UTF-8");

// 因此要将加号转化为UTF-8格式的%20

imgUrl = imgUrl.substring(0, imgUrl.lastIndexOf('/') + 1) + urlTail.replaceAll("\+", "\%20");

/**

* 验证图片格式保证获取动态图片

*/

fileName = vidImg(fileName);

if(fileName.equals("")){

return is;

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

// 写出的路径

InputStream in = null;

try {

// 获取图片URL

URL url = new URL(imgUrl);

// 获得连接

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setRequestProperty("User-Agent",Const.UserAgent);

// 设置10秒的相应时间

connection.setConnectTimeout(10 * 1000);

// 获得输入流

in = connection.getInputStream();

byte[] data=readInputStream(in);

outStream.putNextEntry(new ZipEntry(fileName));

outStream.write(data);

is = true;

return is;

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

outStream.closeEntry();

in.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return is;

}

/**

* 去除重复的图片

* @param list

* @return

*/

public static List<String> removeCf(List<String> list){

List<String> listTemp = new ArrayList<String> ();

for(int i=0;i<list.size();i++){

if(!listTemp.contains(list.get(i))){

listTemp.add(list.get(i));

}

}

return listTemp;

}

喜欢的记得收藏哦


相关文章
|
15天前
|
数据采集 JSON 数据格式
三:《智慧的网络爬虫》— 网络请求模块(下)
本篇文章讲解了网络请求模块中Requests模块的get请求和post请求,并用十几张图示详细介绍了爬虫工具库与开发者工具的操作与使用;同时本篇文章也列举了多个代码示例如:对搜狗网页的爬取;爬取360翻译(中英文互译程序)并以此介绍了重放请求(通过重放请求来确定反爬参数)以及Cookie与Session实战案例 -- 爬取12306查票
32 9
三:《智慧的网络爬虫》—  网络请求模块(下)
|
15天前
|
数据采集 数据安全/隐私保护 Python
二:《智慧的网络爬虫》— 网络请求模块(上)
网络请求模块就是帮助浏览器(客户端)向服务器发送请求的​。在Python3之前的版本(Python2版本)中所使用的网络请求模块是urllib模块​;在Python3现在的版本中通过urllib模块进行升级 有了现在所使用的requests模块,也就是requests模块是基于urllib模块进行开发的。本篇文章讲解的是urllib模块。
14 2
二:《智慧的网络爬虫》—  网络请求模块(上)
|
15天前
|
数据采集 缓存 安全
一:《智慧的网络爬虫》— 认识爬虫
网络爬虫又称为网络蜘蛛;网络蚂蚁;网络机器人等,可以自动高效地从互联网的海量信息中浏览获取到我们感兴趣的信息,在浏览信息的时候需要按照我们制定的规则进行,而这些规则就是网络爬虫算法。使用Python可以很方便地编写出爬虫程序,进行互联网信息的自动化检索,也就是代替人去模拟浏览器进行网页操作​。在本篇文章中需掌握http与https协议,以及如何去抓包
17 2
一:《智慧的网络爬虫》—  认识爬虫
|
21天前
|
数据采集 存储 数据挖掘
Python网络爬虫实战:抓取并分析网页数据
使用Python的`requests`和`BeautifulSoup`,本文演示了一个简单的网络爬虫,抓取天气网站数据并进行分析。步骤包括发送HTTP请求获取HTML,解析HTML提取温度和湿度信息,以及计算平均温度。注意事项涉及遵守robots.txt、控制请求频率及处理动态内容。此基础爬虫展示了数据自动收集和初步分析的基础流程。【6月更文挑战第14天】
108 9
|
19天前
|
Python
【干货】Python下载网络小说
【干货】Python下载网络小说
15 2
网络请求和下载,ping baidu Ctrl + C停掉,wegt命令可以在命令行内下载网络文件
网络请求和下载,ping baidu Ctrl + C停掉,wegt命令可以在命令行内下载网络文件
|
4天前
|
Linux Shell 网络性能优化
Wondershaper网络限制脚本源码分析一(下载速度限制篇)
Wondershaper 是一个简单的 Linux 命令行工具,用于自动管理和控制网络接口的上行和下行带宽,旨在为用户提供稳定的网络体验,尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能,但与直接使用 tc 相比,Wondersbaper 提供了更简洁易用的界面,特别适合没有深入网络管理知识的用户,但它其实就是由一个bash脚本组成,当然里面的思想非常精华。
|
1月前
|
数据采集 JSON API
自动化Reddit图片收集:Python爬虫技巧
自动化Reddit图片收集:Python爬虫技巧
|
1月前
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
|
9天前
|
文字识别 开发工具 Android开发
视觉智能开放平台操作报错合集之使用人脸属性检测接口,出现报错:图片无法下载,请检查链接是否可访问和本地网络情况,该如何解决
在使用视觉智能开放平台时,可能会遇到各种错误和问题。虽然具体的错误代码和消息会因平台而异,但以下是一些常见错误类型及其可能的原因和解决策略的概述,包括但不限于:1. 认证错误、2. 请求参数错误、3. 资源超限、4. 图像质量问题、5. 服务不可用、6. 模型不支持的场景、7. 网络连接问题,这有助于快速定位和解决问题。