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,一经查实,立即删除!

相关文章

扩展方法必须在非泛型静态类中定义

扩展方法必须在非泛型静态类中定义&#xff1a;public class CustomerHelperClass{public static MvcHtmlString CreateImage(string p_w_picpathSource, string altText, string width, string height){//通过TagBulider创建标签TagBuilder p_w_picpathTag new TagBuilder(&…

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

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

C# WPF设备监控软件(经典)-下篇

上节已经对本软件的功能和意图进行了详细讲解&#xff0c;这节就不再啰嗦&#xff0c;本节主要对功能实现和代码部分展开讲解.01—前台代码前台XAML:<Window x:Class"EquipmentMonitor.EquipmentView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pr…

[转]互联网最大谣言:程序员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…

cobbler koan自动重装系统

介绍 koan是kickstart-over-a-network的缩写&#xff0c;它是cobbler的客户端帮助程序&#xff0c;koan允许你通过网络提供虚拟机&#xff0c;也允许你重装已经存在的客户端。当运行时&#xff0c;koan会从远端的cobbler server获取安装信息&#xff0c;然后根据获取的安装信息…

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…

老司机带你重构Android的v4包的部分源码

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。https://www.jianshu.com/p/a08d754944c4 转载请标明出处&#xff1a;https://www.jianshu.com/p/a08d754944c4 本文出自 AWeiLoveAndroid的博客 【前言】过年回家忙着干活&#xff0c;忙着给亲戚的孩…

.NET静态代码织入——肉夹馍(Rougamo) 发布1.1.0

肉夹馍是什么肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件。.NET常用的AOP有Castle DynamicProxy、AspectCore等&#xff0c;以上两种AOP组件都是通过运行时生成一个代理类执行AOP代码的&#xff0c;肉夹馍则是在代码编译时直接修…

Msys2 国内源(2017.3.30)

确定可用&#xff01; Server https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch转载于:https://www.cnblogs.com/baud/p/6644887.html

基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】...

密码模式&#xff08;Resource Owner Password Credentials Grant&#xff09;中&#xff0c;用户向客户端提供自己的用户名和密码。客户端使用这些信息&#xff0c;向"服务商提供商"索要授权。基于之前的 IdentityServer3 实现 OAuth 2.0 授权服务【客户端模式(Clie…

【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;受到了很多开发者的喜爱。并且随着工业化的进…