java爬虫-简单爬取网页图片

  刚刚接触到“爬虫”这个词的时候是在大一,那时候什么都不明白,但知道了百度、谷歌他们的搜索引擎就是个爬虫。

现在大二。再次燃起对爬虫的热爱,查阅资料,知道常用java、python语言编程,这次我选择了java。在网上查找的

代码在本地跑大部分都不能使用,查找相关的资料教程也没有适合的。实在头疼、、、

  现在自己写了一个简单爬取网页图片的代码,先分析一下自己写的代码吧

            //获得html文本内容String HTML = cm.getHtml(URL);//获取图片标签List<String> imgUrl = cm.getImageUrl(HTML);//获取图片src地址List<String> imgSrc = cm.getImageSrc(imgUrl);//下载图片cm.Download(imgSrc);

  简单分为四个功能方法(函数),首先是要获取html文本

 //获取HTML内容private String getHtml(String url)throws Exception{URL url1=new URL(url);//使用java.net.URLURLConnection connection=url1.openConnection();//打开链接InputStream in=connection.getInputStream();//获取输入流InputStreamReader isr=new InputStreamReader(in);//流的包装BufferedReader br=new BufferedReader(isr);String line;StringBuffer sb=new StringBuffer();while((line=br.readLine())!=null){//整行读取sb.append(line,0,line.length());//添加到StringBuffer中sb.append('\n');//添加换行符
        }//关闭各种流,先声明的后关闭
        br.close();isr.close();in.close();return sb.toString();}

然后在获取的html文本中寻找图片,根据html标记语言不难发现图片通常带有<img>,所以

写一个关于img的正则表达式

    // 获取img标签正则private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";

接着是获取img标签信息,大部分涉及的是集合接口和正则表达式的知识

//获取ImageUrl地址private List<String> getImageUrl(String html){Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);List<String>listimgurl=new ArrayList<String>();while (matcher.find()){listimgurl.add(matcher.group());}return listimgurl;}

然后获取img标签信息中找取图片的地址信息,需要构造图片地址的正则表达式

// 获取src路径的正则private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";

接着是获取图片地址的信息,大部分涉及的也是集合接口和正则表达式的知识

//获取ImageSrc地址private List<String> getImageSrc(List<String> listimageurl){List<String> listImageSrc=new ArrayList<String>();for (String image:listimageurl){Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);while (matcher.find()){listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1));}}return listImageSrc;}

最后通过图片地址信息下载图片

//下载图片private void Download(List<String> listImgSrc) {try {//开始时间Date begindate = new Date();for (String url : listImgSrc) {//开始时间Date begindate2 = new Date();String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());URL uri = new URL(url);InputStream in = uri.openStream();FileOutputStream fo = new FileOutputStream(new File("src/res/"+imageName));//文件输出流byte[] buf = new byte[1024];int length = 0;System.out.println("开始下载:" + url);while ((length = in.read(buf, 0, buf.length)) != -1) {fo.write(buf, 0, length);}//关闭流
                in.close();fo.close();System.out.println(imageName + "下载完成");//结束时间Date overdate2 = new Date();double time = overdate2.getTime() - begindate2.getTime();System.out.println("耗时:" + time / 1000 + "s");}Date overdate = new Date();double time = overdate.getTime() - begindate.getTime();System.out.println("总耗时:" + time / 1000 + "s");} catch (Exception e) {System.out.println("下载失败");}}    

展示一下运行结果:

 

上一下全部代码:

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Main {// 地址private static final String URL = "http://www.tooopen.com/view/1439719.html";// 获取img标签正则private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";// 获取src路径的正则private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";public static void main(String[] args) {try {Main cm=new Main();//获得html文本内容String HTML = cm.getHtml(URL);//获取图片标签List<String> imgUrl = cm.getImageUrl(HTML);//获取图片src地址List<String> imgSrc = cm.getImageSrc(imgUrl);//下载图片
            cm.Download(imgSrc);}catch (Exception e){System.out.println("发生错误");}}//获取HTML内容private String getHtml(String url)throws Exception{URL url1=new URL(url);URLConnection connection=url1.openConnection();InputStream in=connection.getInputStream();InputStreamReader isr=new InputStreamReader(in);BufferedReader br=new BufferedReader(isr);String line;StringBuffer sb=new StringBuffer();while((line=br.readLine())!=null){sb.append(line,0,line.length());sb.append('\n');}
        br.close();isr.close();in.close();return sb.toString();}//获取ImageUrl地址private List<String> getImageUrl(String html){Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);List<String>listimgurl=new ArrayList<String>();while (matcher.find()){listimgurl.add(matcher.group());}return listimgurl;}//获取ImageSrc地址private List<String> getImageSrc(List<String> listimageurl){List<String> listImageSrc=new ArrayList<String>();for (String image:listimageurl){Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);while (matcher.find()){listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1));}}return listImageSrc;}//下载图片private void Download(List<String> listImgSrc) {try {//开始时间Date begindate = new Date();for (String url : listImgSrc) {//开始时间Date begindate2 = new Date();String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());URL uri = new URL(url);InputStream in = uri.openStream();FileOutputStream fo = new FileOutputStream(new File("src/res/"+imageName));byte[] buf = new byte[1024];int length = 0;System.out.println("开始下载:" + url);while ((length = in.read(buf, 0, buf.length)) != -1) {fo.write(buf, 0, length);}in.close();fo.close();System.out.println(imageName + "下载完成");//结束时间Date overdate2 = new Date();double time = overdate2.getTime() - begindate2.getTime();System.out.println("耗时:" + time / 1000 + "s");}Date overdate = new Date();double time = overdate.getTime() - begindate.getTime();System.out.println("总耗时:" + time / 1000 + "s");} catch (Exception e) {System.out.println("下载失败");}}
}

  本人还是java初学者,能力有限,如有更好的代码或者教程可以留言,我们可以交流学习。
以上还有不足或者不对之处请指出,非常感谢个位。

转载于:https://www.cnblogs.com/jinxiaohang/p/6637209.html

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

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

相关文章

Windows Server 2016-图形化迁移FSMO角色

上章节我们简单介绍了三种不同方式查看FSMO主机角色信息&#xff0c;在开篇之前我们简单回顾一下FSMO五种操作主机角色&#xff1a;林范围操作主机角色有两种&#xff0c;分别是 架构主机角色&#xff08;Schema Master&#xff09;和 域命名主机角色&#xff08;Domain Naming…

[转]互联网最大谣言:程序员35岁必淘汰?今天我就来击碎他

朋友&#xff0c;只要你是程序员&#xff0c;你一定知道996和“程序员35岁必死”的言论。 这两个话题在互联网上的讨论一次比一次激烈。 996工作制&#xff0c;众所周知&#xff0c;每天早上9点到岗&#xff0c;一直待到晚上9点&#xff0c;每周工作6天&#xff0c;很多互联网公…

【ArcGIS微课1000例】0057:将多波段栅格(影像.tif)背景设置为无数据nodata的方法

本文讲解将多波段栅格(影像.tif)背景设置为无数据nodata的方法。 文章目录 一、背景值识别二、背景值去除【推荐阅读】: 【ArcGIS微课1000例】0056:将单波段栅格背景设置为无数据NoData的方法 一、背景值识别 可以用【识别】工具来获取影像数据的背景值。 在背景上单击,…

华为HCIA认证H12-811题库新增

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…

经典Java微服务架构教程 微服务从开发到部署

图书目录脑图&#xff1a; 本书根据开源项目整理&#xff0c;由于原在线文档无法正常使用&#xff0c;本人重新在Github上重新布署了一套在线文档。 书中讲解非常详细&#xff0c;并且有在线的视频教程&#xff0c;另有在线文档和在线的源码。 书中的代码由于PDF排版问题可能显…

linux下redis安装

转自&#xff1a;http://blog.java1234.com/blog/articles/311.html Redis从一开始就只支持Linux&#xff0c;后面虽然有团队搞出Window版本&#xff0c;但是我还是建议大伙安装到Linux中。 准备工作 &#xff08;wm VirtualBox&#xff09; VMware 以及Xshell https://redis…

Quartz.NET simple_demo

Quartz.NET是一个开源的作业调度框架&#xff0c;非常适合在平时的工作中&#xff0c;定时轮询数据库同步&#xff0c;定时邮件通知&#xff0c;定时处理数据等。 Quartz.NET允许开发人员根据时间间隔&#xff08;或天&#xff09;来调度作业。它实现了作业和触发器的多对多关系…

Hello Playwright:(9)执行 JavaScript 代码

Playwright 提供了大量的 API 用于与页面元素交互&#xff0c;但是在某些场景下还是不能完全满足要求。比如我们需要获得包括元素本身的 HTML&#xff0c;但是目前只有下列 API :InnerHTMLAsync 返回元素内的 HTML 内容InnerTextAsync 返回元素内的文本内容而使用 JavaScript 执…

【PhotoScan精品教程】photoscan无法启动此程序,因为计算机中丢失cholmod.dll解决办法

安装完航测软件photoscan&#xff0c;打开时提示&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失 cholmod.dll解决办法。 错误提示&#xff1a; 解决办法&#xff1a; 并不是缺少该动态链接库文件&#xff0c;而是补丁文件拷贝错了。

什么是中台?企业为什么要建中台?从数据中台到AI中台。

从去年开始&#xff0c;好像就有一只无形的手一直将我与“微服务”、“平台化”、“中台化”撮合在一起&#xff0c;给我带来了很多的困扰和思考与收获。 故事的开始源于去年的技术雷达峰会&#xff0c;我在会上做了一场关于平台崛起的主题分享&#xff08;《The Rise of Plat…

【GlobalMapper精品教程】035:用CASS自带数据创建高程地形、等高线教程

本文讲述globalmapper用CASS自带数据创建高程地形、等高线教程。 文章目录 1. 坐标生成点2. 点转高程格网3. 生成等高线4. 保存等高线CASS自带等高线数据dgx.dat预览:包含点号、编码、东坐标、北坐标、高程5列,可以不用做任何修改,在Globalmapper中生成点。 1. 坐标生成点 …

SaaS产品的免费试用到底该怎么做

”SaaS产品的免费试用&#xff0c;绝不仅仅只是开放产品试用期这么简单&#xff0c;很多企业并没有重视免费试用模式的搭建和转化路径“ 很多SaaS厂商的产品都会提供免费试用的机会&#xff0c;虽然试用的最终目标是促成用户为产品价值付费&#xff0c;但是很多SaaS厂商在开放系…

【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

前言&#xff1a;在C/S架构上&#xff0c;WPF无疑已经是“桌面一霸”了。在.NET生态环境中&#xff0c;很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了&#xff0c;并且基于MVVM的开发模式&#xff0c;受到了很多开发者的喜爱。并且随着工业化的进…

【ArcGIS Pro微课1000例】0022:基于DEM进行流域分析生成流域图

文章目录 一、填洼二、流向分析三、计算流域一、填洼 填洼Fill,在进行水文分析后续操作前,首先要对DEM进行填洼,创建无凹陷点的DEM。 填洼需要使用水文分析工具下的【填洼】。 确定输入与输出即可。 填洼结果: 二、流向分析 在ArcGIS中使用的是八方向流量建模(D8算法),工…

[转]Druid概述

目录 1.Apache Druid简介 2.Apache Druid架构 2.1 服务器类型 2.1.1 Master Server 2.1.2 Query 2.1.3 Data Server 2.2 外部依赖 2.2.1 Deep Storage 2.2.2 Metadata Storage 2.2.3 Zookeeper 2.3 存储设计 3.在HDP上安装Apache Druid 3.1 准备数据库 3.2 安装…

在 .NET MAUI 中如何更好地自定义控件

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;10分钟)今天&#xff0c;我想谈谈并向您展示在.NET MAUI中完全自定义控件的方法。在查看 .NET MAUI 之前&#xff0c;让我们回到几年前&#xff0c;回到 Xamarin.Forms 时代。那时&#xff0c;我们有很多自定义控件的…

【GlobalMapper精品教程】036:基于DEM的流域计算生成流域图

Globalmapper基于DEM的流域计算生成流域图教程。 文章目录一、加载DEM二、流域分析一、加载DEM 加载配套实验数据。 二、流域分析 GM中的流域分析工具位于分析→生成流域&#xff0c;如下所示&#xff1a; 参数设置如下&#xff1a; 流域计算结果&#xff1a;

html之file标签 --- 图片上传前预览 -- FileReader

记得以前做网站时&#xff0c;曾经需要实现一个图片上传到服务器前&#xff0c;先预览的功能。当时用html的<input type"file"/>标签一直实现不了&#xff0c;最后舍弃了这个标签&#xff0c;使用了其他方式来实现了这个功能。 今天无意发现了一个知识点&#…

Android Studio3.0简介

Android Studio 3.0.0 Android Studio 3.0.0 (2017年10月)是一个主要版本&#xff0c;包括各种新功能和改进 Android插件的Gradle 3.0.0 • 支持Android 8.0 • 支持Java 8库和Java 8语言功能&#xff08;没有Jack编译器&#xff09; • 支持Android测试支持库1.0&#xff08;A…

什么是JavaBean、Bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?

前言&#xff1a; 在Java开发中经常遇到这些概念问题&#xff0c;有的可能理解混淆&#xff0c;有的可能理解不到位&#xff0c;特此花了很多时间理顺了这些概念。不过有些概念实际开发中并没有使用到&#xff0c;可能理解还不够准确&#xff0c;只能靠后续不断纠正了。 1、什么…