非常草草的实现,能够完美实现对ecnu主页图片的抓取【跑,其他的都会报错或有缺失。

究其原因还是在对img标签上的解析上碰到了非常大的困难,正则表达式也不顶用,下一步考虑使用jsoup进行处理。

同时,对于图片的读写也较慢,可能与我是一字节一字节写入文件的有关,可以考虑使用imagio包进行处理。

还有一点可以改进的是对异常的处理,这个等看了coreJava相关章节再说,不急。

初步先实现给定网址,爬取图片至指定路径。之后考虑使用邮件发送(似乎不实用)

最终目标是架在服务器上,前端接收用户要求,后端进行爬取处理。

************************************************************************************************************

下载器类

package just4test;
import java.net.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Downloader {private Queue <String> col;//用队列,更加真实private String base,path;public Downloader (String abase,String apath) {base=abase;path=apath;col  = new LinkedList<>();//不能直接构造queue对象,用LinkedList作为其实现类,优先队列也可}/** @return html代码* 获取网页html,这里默认utf8编码*/public String getHtml() throws Exception {URL url = new URL(base);HttpURLConnection connection= (HttpURLConnection)url.openConnection();String res="";Scanner cin = new Scanner (connection.getInputStream());while (cin.hasNextLine())//一行一行读入res += cin.nextLine()+'\n';cin.close();return res;}/** 辅助函数,从html中筛出图片,放进队列中,更好的方法是使用jsoup,等学习了再用*/public void filter () throws Exception {String res = this.getHtml();String homepage = base;int pos0= base.indexOf("//");int pos1 = base.indexOf('/',pos0+2);if (pos1!=-1)homepage = base.substring(0,pos1);Pattern p = Pattern.compile("<img.*src=\"(.*?)\"");//正则表达式捕获图片urlMatcher m = p.matcher(res);while (m.find()){//每找到一次图片就放进队列中String tmp = m.group(1);if (tmp.indexOf('.')!=-1) //是图片一定得有dotif (tmp.substring(0,2).equals("//"))col.add("http:"+tmp);else if (tmp.charAt(0)=='/')col.add(homepage+tmp);elsecol.add(tmp);}}public Queue<String> getCol() {return col;}/** 下载图片至指定路径,这里用的是最朴素的方法,可以用花哨点的imageIO,一会再研究* 如果文件同名会自动覆盖,需修正*/public void download()throws Exception {filter();File fp = new File(path);if (!fp.exists())fp.mkdirs();//如果该路径不存在,创建它int i=0;InputStream cin = null;OutputStream cout = null;while (col.size()!=0) {//遍历整个队列String tmp = col.remove();String filename = tmp.substring(tmp.lastIndexOf('/'));//找出文件名URL url = new URL(tmp);HttpURLConnection connection = (HttpURLConnection)url.openConnection();cin = connection.getInputStream();File file =new File (fp+filename);//这里默认fp最后不带/,文件名前面带/cout = new FileOutputStream (file);//输出流while ((i=cin.read())!=-1) //将其当作普通二进制文件进行处理,read到头时返回-1cout.write(i);//写入文件cin.close();//关闭输入输出流cout.close();}}
}

测试类

package just4test;
import java.util.*;
import java.io.*;
public class Main {public static void main(String[] args) {try {Scanner cin = new Scanner (System.in);System.out.println("输入要抓取的网页");String base = cin.next();System.out.println("输入存放路径");String path = cin.next();cin.close();Downloader down = new Downloader(base,path);/*System.out.println(down.getHtml());down.filter();Queue<String> que = down.getCol();for (String z:que)System.out.println(z);*/down.download();System.out.println("下载成功!");}catch (FileNotFoundException e) {//关于异常的代码写得真的很偷懒,下次补上e.printStackTrace();System.out.println("小错误,不慌");}catch(Exception e) {e.printStackTrace();System.out.println("下载失败");}}}

以上

部分成功的Java图片抓取相关推荐

  1. Java图片抓取2.0

    使用了jsoup这一第三方包,解析HTML效果拔群,同时使用了缓冲区来进行输入输出,提升效率 下载器类 package just4test2; import java.io.*; import jav ...

  2. iOS—网络实用技术OC篇网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  3. Java爬虫抓取网页

    Java爬虫抓取网页 原作者:hebedich  原文链接 下面直接贴代码: import java.io.BufferedReader; import java.io.InputStreamRead ...

  4. 玩转Java网页抓取

    - 使用Java进行网页抓取 - 用于网页抓取的流行语言有Python.JavaScript和Node.js.PHP.Java.C#等.因为有很多选择,想要确定哪种语言最合适并不容易.每种语言都有其优 ...

  5. java爬虫抓取网页数据论坛_Java爬虫抓取网页

    Java爬虫抓取网页原作者:hebedich  原文链接 下面直接贴代码: import java.io.BufferedReader; import java.io.InputStreamReade ...

  6. Python_百度图片以及百度贴吧图片抓取

    一.百度图片抓取 百度图片抓取存在两个难点: (1)没有翻页功能,只有下拉不断get新的img,这个暂时没有解决,据说可以通过selenium模块来模拟浏览器动作进行,暂未入手,只能抓取最开始get到 ...

  7. java图片颜色取反色,照片底片模式

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java图片颜色取反色,照片底片模式 测试代码 public static void main(String[] args) {//文件与Buff ...

  8. Python爬虫之gif图片抓取

    Python爬虫之gif图片抓取 标签:图片爬虫 这几天,对于怎么去爬取图片很感兴趣,就研究了一下,图片爬虫可以说是有简单,更有复杂的,今天,我做了一个比较简单的gif的图片爬虫,仅仅学习一下怎么进行 ...

  9. java爬虫 抓取知乎,java爬虫抓取知乎推荐总是乱码

    求助java爬虫抓取知乎推荐总是乱码 仿照http://blog.csdn.net/pleasecallmewhy/article/details/17630063写一个简单的抓取知乎推荐(http: ...

最新文章

  1. 12,缓冲运动。匀速运动停止条件
  2. Java for LeetCode 206 Reverse Linked List
  3. 配置Servlet3.0的方式和注意事项!
  4. axios安装_一起学Vue:访问API(axios)
  5. 截流式合流制设计流量计算_截流式合流制截污管设计污水量的实测统计方法
  6. vscode配置python2和python3_VS Code中配置python版本以及Python多版本
  7. Moonlight 串流分辨率设置
  8. 2020考研初期作息时间表
  9. CRM客户管理系统的功能模块有哪些
  10. springboot2集成shiro认证鉴权(上篇)
  11. CSS3硬件加速 - GPU加速
  12. GoJS去除水印方法
  13. 【航拍干货】航测区域重点建筑物精细化建模航拍技巧
  14. candence pcb走线等长_PCB走线角度选择 - PCB Layout 跳坑指南 - 吴川斌的博客
  15. Android急速模拟器Genymotion安装指北
  16. 使用MATLAB计算一幅图像的熵
  17. Android 学习日记1:AndroidKiller连接网易MuMu模拟器
  18. 维基百科:人人都能改写的网络百科全书
  19. php得到时间 毫秒数,php获取毫秒_php获取当前时间的毫秒数
  20. python 爬取5566图库图片

热门文章

  1. Python人工智能之图片识别,一行代码实现图片文字识别
  2. 阅读一定时间后获得实现逻辑_从“词典”到“阅读”,网易有道英语学习帝国崛起?...
  3. 【总结】有三AI所有原创GAN相关的学习资料汇总(2022年12月)
  4. 如何在Mac上的 iMovie剪辑中校正和增强音频?
  5. 微机:存储器全译码产生片选信号的题目
  6. 农行人工智能机器人安安_深圳农行“小小木匠” 发散思维玩转创意手工
  7. Hbase的数据刷写
  8. 互联网公司彩虹屁指南
  9. Mysql的case when then实现报表分组不同字段显示不同结果打勾
  10. Fiddler 抓包工具使用