




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用Java写的网页图片、CSS、JavaScript分类下载器前段时间老师让我们要做一个JavaEE项目,是一个电子商务网站-中国鲜花网,前台模板就用这个网站的,但是用浏览器直接下载来的图片和样式表等文件全在一个文件夹,需要给它批量替换,最要命的是浏览器的这个功能不能够下载样式表中的背景图片,所以很多网页都会显示不正常,鉴于此,自己花了几个小时研究了一下正则表达式写了这个工具,基本上一般网页下载都没什么问题,就是碰到有些网页是需要登录的,比如说用户中心,你直接把地址敲进去下载下来的一般都是登录页面,所以后来又做了个替换“浏览器保存的网页”中的图片和样式表、JavaScript文件的小工具,就是背景图片的功能还没做(要做也不难),这个程序代码放教室了,以后有时间也贴上来。名字随便取的,叫“网页资源分类下载器”,界面如下:下载后的文件夹形式如下:原理简要分析一下(不分析估计大部分都清楚):就是首先把网页html下载下来,然后用正则表达式遍历其中的图片、样式表、JavaScript文件,匹配出来的文件再和网址拼接出真正的下载地址(比如碰到./要退一层目录等),然后下载到指定文件夹,保存网页的html之前还要将各个资源的地址批量替换成新的地址。下载这样下载下来的一般只有前景图片,背景图片还没法下载,所以再遍历下载下来的样式表文件,用background-image匹配出符合条件的背景图片,再根据样式表文件的网页相对地址和整个网页的地址拼接出背景图片的真实地址,然后下载下来。目前测试中国鲜花网的几个页面都没什么问题,所有资源都能正常下载,当然肯定还有很多Bug,有兴趣的可以看一下源代码。主要代码如下(界面的代码就省掉了):public String html=;/存放网页HTML源代码 public int cssCount=0;/下载成功的样式表文件个数 public int jsCount=0;/下载成功的JavaScript文件个数 public int normalImageCount=0;/普通图片数量 public int backgroundImageCount=0;/背景图片数量 /* * 开始下载 */ public void startDownload() buttonStart.setText(正在下载); buttonStart.setEnabled(false); File savePath=new File(txtSavePath.getText(); /计数清零 cssCount=0; jsCount=0; normalImageCount=0; backgroundImageCount=0; /创建必要的一些文件夹 if(!savePath.exists() savePath.mkdir();/如果文件夹不存在,则创建 File css=new File(savePath+/+txtCss.getText(); File js=new File(savePath+/+txtJs.getText(); File images=new File(savePath+/+txtImages.getText(); if(!css.exists() css.mkdir(); System.out.println(css文件夹不存在,已创建!); if(!js.exists() js.mkdir(); System.out.println(js文件夹不存在,已创建!); if(!images.exists() images.mkdir(); System.out.println(images文件夹不存在,已创建!); /下载网页html代码 System.out.println(开始下载网页HTML源代码!); String url=txtUrl.getText(); if(!url.startsWith(http:/) url=http:/+url; html=getHTML(url, comboBoxEncode.getSelectedItem().toString(); System.out.println(网页HTML下载成功!); if(checkBoxCss.isSelected() System.out.println(开始下载样式表文件!); regx(, href=, url,txtCss.getText(); if(checkBoxJs.isSelected() System.out.println(开始下载JavaScript文件!); regx(, src=, url, txtJs.getText(); if(checkBoxImages.isSelected() System.out.println(开始下载网页前景图片文件!); regx(, src=, url, txtImages.getText(); /保存网页HTML到文件 try File newFile=new File(savePath.toString()+/+txtTitle.getText(); newFile.createNewFile(); OutputStreamWriter writer=new OutputStreamWriter(new FileOutputStream(newFile), comboBoxEncode.getSelectedItem().toString(); BufferedWriter bw=new BufferedWriter(writer); bw.write(html); bw.close(); writer.close(); catch (IOException e) e.printStackTrace(); String result=恭喜,全部资源下载完毕!; result+=累计下载css文件+cssCount+个;n; result+=累计下载JavaScript文件+jsCount+个;n; result+=累计下载前景图片+normalImageCount+张;n; result+=累计下载背景图片+backgroundImageCount+张。n; System.out.println(result); JOptionPane.showMessageDialog(null, result,下载结束,JOptionPane.INFORMATION_MESSAGE); buttonStart.setText(开始下载); buttonStart.setEnabled(true); /* * 最核心的代码,从网页html中查找符合条件的图片、css、js等文件并批量下载 * param regx 检索内容的一级正则表达式,结果是含开始、结束标签的整个字符串,例如: * param head 已经检索出的标签块中要提取的字符的头部,包含前面的双引号,如:src= * param url 要下载的网页完整地址,如: * param folderName 文件夹名,如:css */ public void regx(String regx,String head,String url,String folderName) /下载某种资源文件 Pattern pattern=Ppile(regx);/新建一个正则表达式 Matcher matcher=pattern.matcher(html);/对网页源代码进行查找匹配 while(matcher.find()/对符合条件的结果逐条做处理 Matcher matcherNew=Ppile(head+.*).matcher(matcher.group(); if(matcherNew.find() /对于CSS匹配,查找出的结果形如:href=skins/default/css/base.css rel=stylesheet type=text/css String myUrl=matcherNew.group(); myUrl=myUrl.replaceAll(head, );/去掉前面的头部,如:href: myUrl=myUrl.substring(0,myUrl.indexOf();/从第一个引号开始截取真正的内容,如:skins/default/css/base.css String myName=getUrlFileName(myUrl);/获取样式表文件的文件名,如:base.css html=html.replaceAll(myUrl, folderName+/+myName);/替换html文件中的资源文件 myUrl=joinUrlPath(url, myUrl);/得到最终的资源文件URL,如:/skins/default/css/base.css /System.out.println(发生地健康:+myUrl); /去掉文件名不合法的情况,不合法的文件名字符还有好几个,这里只随便举例几个 if(!myName.contains(?)&!myName.contains()&!myName.contains(/) downloadFile(myUrl, txtSavePath.getText()+/+folderName+/+myName);/开始下载文件 System.out.println(成功下载文件:+myName); if(regx.startsWith(img)/如果是下载前景图片文件 normalImageCount+; if(regx.startsWith(script)/如果是下载JS文件 jsCount+; if(regx.startsWith(link)/如果是下载css文件 cssCount+; /将刚刚下载的CSS文件实例化 File cssFile=new File(txtSavePath.getText()+/+folderName+/+myName); String txt=readFile(cssFile,gb2312);/读取CSS文件的内容,这里用默认的gb2312编码 /开始匹配背景图片 Matcher matcherUrl=Ppile(background:url(.*).matcher(txt); while (matcherUrl.find() /去掉前面和后面的标记,得到的结果如:./images/ico_4.gif String temp=matcherUrl.group().replaceAll(background:url(, ).replaceAll(), ); /拼接出真正的图片路径,如:/skins/default/images/ico_4.gif String backgroundUrl=joinUrlPath(myUrl, temp); /获取背景图片的文件名,如:ico_4.gif String backgroundFileName=getUrlFileName(backgroundUrl); /背景图片要保存的路径,如:c:/userslxadesktop网页imagesico_4.gif String backgroundFilePath=txtSavePath.getText()+/+txtImages.getText()+/+backgroundFileName; if(!new File(backgroundFilePath).exists()/如果不存在同名文件 if(downloadFile(backgroundUrl, backgroundFilePath)/开始下载背景图片 backgroundImageCount+;/计数加1 System.out.println(成功下载背景图片:+backgroundFileName); else System.out.println(指定文件夹已存在同名文件,已为您自动跳过:+backgroundFilePath); /* * 根据指定的URL下载html代码 * param pageURL 网页的地址 * param encoding 编码方式 * return 返回网页的html内容 */ public String getHTML(String pageURL, String encoding) StringBuffer pageHTML = new StringBuffer(); try URL url = new URL(pageURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty(User-Agent, MSIE 9.0);/设置客户的浏览器为IE9 BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding); String line = null; while (line = br.readLine() != null) pageHTML.append(line); pageHTML.append(rn); connection.disconnect(); catch (Exception e) e.printStackTrace(); return pageHTML.toString(); /* * 根据URL下载某个文件 * param fileURL 下载地址 * param filePath 存放的路径 */ public boolean downloadFile(String fileURL,String filePath) try File file=new File(filePath); file.createNewFile(); StringBuffer sb = new StringBuffer(); URL url = new URL(fileURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty(User-Agent, MSIE 9.0);/设置客户的浏览器为IE9 byte buffer = new byte1024; InputStream is = connection.getInputStream(); FileOutputStream fos = new FileOutputStream(file); int len = 0; while (len = is.read(buffer) != -1) fos.write(buffer, 0, len); fos.close(); is.close(); connection.disconnect(); return true; catch (IOException e) System.out.println(该文件不存在:+fileURL); return false; /* * 读取某个文本文件的内容 * param file 要读取的文件 * param encode 读取文件的编码方式 * return 返回读取到的内容 */ public String readFile(File file,String encode) try InputStreamReader read = new InputStreamReader (new FileInputStream(file),encode); BufferedReader bufread=new BufferedReader(read); StringBuffer sb=new StringBuffer(); String str=; while (str = bufread.readLine() != null) sb.append(str+n); String txt=new String(sb); return txt; catch (Exception e) e.printStackTrace(); return null; /* * 获取URL中最后面的真实文件名 * param url 如:/bg.jpg * return 返回bg.jpg */ public String getUrlFileName(String url) return url.split(/)url.split(/).length-1; /* * 获取URL不带文件名的路径 * param url 如:/bg.jpg * return 返回 */ public String getUrlPath(String url) r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 复合板生产基地项目规划设计方案
- 2025年耳鼻喉科鼻窦炎诊断治疗实操考核答案及解析
- 2025年中医诊疗理论知识模拟测试卷答案及解析
- 2025年古代饮食常识题库及答案
- 2025年影像科医学影像学技术与图像解读练习答案及解析
- 2025年就业安全试题答案及答案
- 铝灰渣综合利用项目投资计划书
- 音乐面试初中真题及答案
- 2025年外科医师电刀手术操作技能考核模拟测试卷答案及解析
- 8.4 机械能守恒定律(教学设计)高一物理同步备课系列(人教版2019必修第二册)
- 小学童诗绘读活动方案
- GB 17051-2025二次供水设施卫生规范
- 老年患者视听障碍的护理
- 中石油物资管理制度
- 丰田物流仓储管理制度
- (二)冲床安全操作规程
- 电动汽车充电基础设施十五五发展规划
- 《泥塑的乐趣》教学课件-2024-2025学年鲁教版(五四学制)(2024)初中美术六年级上册
- (新版)焊工职业技能考试题库及答案(含各题型)
- 征拆协调岗招聘试题及答案
- T/CNFAGS 10-2024双加压稀硝酸工艺用硝酸四合一机组技术规范
评论
0/150
提交评论