前言

前一段时间我们有一个网页的projiect小项目,要求学习bootstarp。然而自己写的模板和别人写好的东西,无论从美观和手机运行的兼容性上差距都很巨大。中途我们放弃自己写的东西,开始别人的模板。有些甚至不会偷的同学甚至还付费下载都什么年代了,程序员还要花钱买模板。那次结束后,突发奇想能不能写个程序,让他自动下载模板。经过不断努力和解决bug,最终取得了成功。

思路

大致思路为:输入模板的一个页面为url,通过这个链接遍历所有与之有关的链接放到hashset中(采用队列的宽度优先遍历bfs)。这个相关用字符判断链接前面的主要域名地址。(链出去的链接不处理,防止无限扩大)。同时,还要将各种url分类放到不同的set中。

html页面分析:抓取html链接。还要按行读取html文本分析其中可能隐藏的css文件(可能有背景图片)。获取js链接,获取image地址css地址,(注意一定要储存绝对地址而不是相对地址)。还有的涉及到上层目录。需要处理。

css页面:按行分析。因为css中可能储存背景图片以及其他logo。
js:直接下载保存。
html:下载保存
image:下载保存

注意点:

  1. 所有下载链接或者其他活动都要在try catch进行,在catch中跳过这个步骤,执行相应步骤。
  2. 下载目录在download自行更改(默认F://download)
  3. 添加jsoup的jar包
  4. 有些图片藏在js文件中和css文件中,所以需要去判断js文件和css文件,我这个只分析了css没分析css。
  5. 由于精力和时间问题,项目并没有晚上,由于笔者此时正则能力不足,大部分采用字符串分割查找或者contains查找,难免有疏漏
  6. 目前代码测试只针对17素材之家部分模板测试有效。其他站点未进行测试
  7. 只是小白,代码亢长低水平,大佬勿喷。
    附上代码如下:

代码

  • 启动主类getmoban
import java.io.IOException;
import java.util.Iterator;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class getmoban {public static void main(String[] args) throws IOException{ExecutorService ex=Executors.newFixedThreadPool(6);Scanner sc=new Scanner(System.in);System.out.println("请输入网址(别太大否则下载不完)");String url=sc.nextLine();geturl g=new geturl(url);//csssearch cssimage=new csssearch();System.out.println(g.file);g.judel();        Iterator it=g.htmlurlset.iterator();       while(it.hasNext()){String name=it.next();try {download download=new download(name);ex.execute(download); }catch(Exception e){}//System.out.println("地址为" name);}Iterator it2=g.jsset.iterator();while(it2.hasNext()){String name=it2.next();try {download download=new download(name);ex.execute(download); }catch(Exception e){}//System.out.println("js地址为" name);}Iterator it3=g.cssset.iterator();while(it3.hasNext())//css需要过滤其中是否有背景图片{String name=it3.next();try {download download=new download(name);ex.execute(download);cssimage.searchimage(name);}catch(Exception e){}//System.out.println("css地址为" name);}Iterator it4=g.imgset.iterator();while(it4.hasNext()){String name=it4.next();try {download download=new download(name);ex.execute(download);  }catch(Exception e){}//System.out.println("image地址为" name);}ex.shutdown();//judel();}
}
  • 分析链接geturl
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Queue;
import java.util.Set;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;public class geturl {public static String url="http://www.17sucai.com/preview/1/2014-11-28/jQuery用户注册表单验证代码/index.html";static String head="http";public geturl(String url){this.url=url;}static String file=url;//文件路径{if(url.contains("http")){head=file.split("//")[0];file=file.split("//")[1];}int last=file.lastIndexOf("/");file=file.substring(0, last);}static Set htmlurlset=new HashSet();//htmlstatic Set jsset=new HashSet();//jsstatic Set imgset=new HashSet();//imagestatic Set cssset=new HashSet();//css样式static Queue queue=new ArrayDeque();//    public geturl() throws IOException
//  {this.judel();}public static void judel() throws IOException {queue.add(url);htmlurlset.add(url);while(!queue.isEmpty()&&queue!=null)//要防止链接无限扩大{String teamurl=queue.poll();//弹出头并且删除节点System.out.println(teamurl);if(!teamurl.endsWith(".com"))//有的网站短小,可能识别有错误    {if(file.indexOf("/")>0){if(teamurl.contains(file.substring(0,file.indexOf("/"))))analyze(teamurl);}elseanalyze(teamurl);}
//          catch(Exception e) {System.out.println("cuo");}           }}public static void analyze(String URL){try {Document doc;doc = Jsoup.connect(URL).timeout(20000).header("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36").ignoreContentType(true).get();Elements all=doc.select("[class]");//检查Elements js=doc.getElementsByTag("script");Elements html=doc.select("a[href]");Elements img=doc.select("img");Elements css=doc.select("link[href]");for(Element e:all){if(e.attr("style")!="")//找到藏在html的css的图片背景{ String tex=e.attr("style");if(tex.contains("url")){String urladress=file;String imgurl=tex.split("url")[1];imgurl=imgurl.split("\\(")[1].split("\\)")[0];//转义字符串if(imgurl.startsWith("'")||imgurl.startsWith("\""))//注意转义字符串{imgurl=imgurl.substring(1,imgurl.length()-1);} while(imgurl.startsWith("..")){imgurl=imgurl.substring(imgurl.indexOf("/") 1);                  urladress=urladress.substring(0,urladress.lastIndexOf("/"));}urladress=head "//" urladress "/" imgurl;imgset.add(urladress);}                }}for(Element htmlelement:html){               String a=htmlelement.absUrl("href").split("#")[0];if(!a.equals("")){if(!htmlurlset.contains(a)&&a.contains(file.substring(0,file.indexOf("/"))))//不存在继续遍历{ queue.add(a);htmlurlset.add(a); //System.out.println(a);}            }               }for(Element jselement:js)//判断JS{String team=jselement.absUrl("src");   if(!team.equals(""))jsset.add(team);//添加}for(Element csselement:css){String team=csselement.absUrl("href");if(!team.equals(""))//绝对路径cssset.add(team);           // System.out.println(e.attr("href"));}for(Element imageelement:img){String team=imageelement.absUrl("src");if(!team.equals(""))//绝对路径imgset.add(team);//System.out.println(e.attr("href"));}}catch(Exception e){if(!queue.isEmpty()) {URL=queue.poll();analyze(URL);}}}               }
  • 分析css(css可能隐藏图片)csssearch
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class csssearch {public static void searchimage(String ur) throws IOException {if(ur.toLowerCase().contains("bootstarp")) {return;}//bootstarp.css过滤掉,肯定没图片Set imgset=new HashSet();//String ur="http://demo.cssmoban.com/cssthemes5/cpts_1019_bpi/css/style.css";String http="http";String fileurl=ur;if(fileurl.startsWith("http")){http=fileurl.split("//")[0];//防止https协议fileurl=fileurl.split("//")[1];}fileurl=fileurl.substring(0,fileurl.lastIndexOf("/"));//System.out.println(fileurl);//测试URL url=new URL(ur);URLConnection conn = url.openConnection();conn.setConnectTimeout(1000);conn.setReadTimeout(5000);conn.connect();InputStream in= conn.getInputStream();InputStreamReader inp=new InputStreamReader(in);BufferedReader buf=new BufferedReader(inp);File file=new File("F:\\download\\" ur.split("//")[1]);if(!file.exists()){file.getParentFile().mkdirs();file.createNewFile();}// BufferedOutputStream bufout=new BufferedOutputStream(new FileOutputStream(file));String tex="";while((tex=buf.readLine())!=null){//          System.out.println(tex);if(tex.contains("url")){String urladress=fileurl;String imgurl=tex.split("url")[1];imgurl=imgurl.split("\\(")[1].split("\\)")[0];//转义字符串if(imgurl.startsWith("'")||imgurl.startsWith("\""))//注意转义字符串{imgurl=imgurl.substring(1,imgurl.length()-1);}//System.out.println(imgurl);//测试while(imgurl.startsWith("..")){imgurl=imgurl.substring(imgurl.indexOf("/") 1);                   urladress=urladress.substring(0,urladress.lastIndexOf("/"));}urladress=http "//" urladress "/" imgurl;//System.out.println(urladress);//down.download(urladress);imgset.add(urladress);}}//  bufout.close();buf.close();inp.close();in.close();Iterator it=imgset.iterator();while(it.hasNext()){       String team=it.next();try {download down=new download(team);Thread t1=new Thread(down);t1.start();System.out.println(team "下载成功");}catch(Exception e) {System.out.println("下载失败:" team);}}}
}
  • download(线程池下载)
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;public class download implements Runnable{public String ur;public download() {}public download(String ur){this.ur=ur;}public static void download(String ur) throws IOException  {        //String ur="http://www.17sucai.com/preview/1266961/2018-06-22/wrj/index.html";String fileplace=ur;if(fileplace.contains("http")){fileplace=fileplace.split("//")[1];}URL url = new URL(ur);URLConnection conn = url.openConnection();conn.setConnectTimeout(4000);conn.setReadTimeout(5000);conn.connect();InputStream in= conn.getInputStream();BufferedInputStream buf=new BufferedInputStream(in);File file=new File("F:\\download\\" fileplace);if(!file.exists()){file.getParentFile().mkdirs();file.createNewFile();}//System.out.print(file.getAbsolutePath()); BufferedOutputStream bufout=new BufferedOutputStream(new FileOutputStream(file));
//   int b=0;
//   while((b=buf.read())!=-1)
//   {//       bufout.write(b);
//       //System.out.println(b "");
//   }byte b[]=new byte[1024];int n=0;while((n=buf.read(b))!=-1){bufout.write(b, 0, n);}in.close();buf.close();         bufout.close();//fullFileName.close();}@Overridepublic void run() {try {download(ur);System.out.println(Thread.currentThread().getName() " 下载" ur "成功");} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}}

目标网站,以及运行效果


还有注意的要进入初始界面,把上面的X 点进去。

只能下载17素材大部分模板。如果以后时间充足,可能会维护下,下载更多模板!

项目github地址

如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流:bigsai

java爬虫下载付费html网页模板相关推荐

  1. java爬虫下载图片到磁盘_java入门爬虫(爬取网页的图片下载到本地磁盘)

    java爬虫入门技术 我们需要用到http协议 从而建立java程序和网页的连接 URL url = new URL("https://www.ivsky.com/tupian/ziranf ...

  2. Java爬虫下载千张美女图片

    目的 爬取搜狗图片上千张美女图片并下载到本地 准备工作 爬取地址:https://pic.sogou.com/pics?query=%E7%BE%8E%E5%A5%B3 分析 打开上面的地址,按F12 ...

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

    刚刚接触到"爬虫"这个词的时候是在大一,那时候什么都不明白,但知道了百度.谷歌他们的搜索引擎就是个爬虫. 现在大二.再次燃起对爬虫的热爱,查阅资料,知道常用java.python语 ...

  4. HTTP编程(Java爬虫-简单爬取网页数据)

    HTTP协议简介 HTTP 是 HyperText Transfer Protocol 的缩写,翻译为超文本传输协议,它是基于 TCP 协议之上的一种请求-响应协议. HTTP请求格式是固定的,由HT ...

  5. 【Java爬虫】爬取网页中的内容,提取其中文字

    挺乱的,临时存一下 package cn.hanquan.craw;import java.io.FileWriter; import java.io.IOException; import java ...

  6. Java爬虫之批量下载LibreStock图片(可输入关键词查询下载)

    前言(废话) 公司产品新版本刚刚上线,所以也终于得空休息一下了,有了一点时间.由于之前看到过爬虫,可以把网页上的数据通过代码自动提取出来,觉得挺有意思的,所以也想接触一下,但是网上很多爬虫很多都是基于 ...

  7. java爬虫爬取互联网上的各大影视网站---360影视(附源码下载)

    关于爬虫: 万维网上有着无数的网页,包含着海量的信息,无孔不入.森罗万象.但很多时候,无论出于数据分析或产品需求,我们需要从某些网站,提取出我们感兴趣.有价值的内容,但是纵然是进化到21世纪的人类,依 ...

  8. python java 爬数据_如何用java爬虫爬取网页上的数据

    当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...

  9. html没有内容怎么爬,Url没有在网页中返回正确的html(对于我的Java爬虫)

    我想从网页上下载一些图像,为此我正在编写爬网程序.我测试了这个页面的几个抓取工具,但没有工作,因为我想.Url没有在网页中返回正确的html(对于我的Java爬虫) 第一步,我收集了770+相机型号( ...

最新文章

  1. WPF:Documents文档--Annomation批注(3)
  2. @@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之
  3. 最大似然估计(MLE:样本观测总体参数)是如何工作的?
  4. Django的电子商务网站的调研
  5. import python settings from_Python的Django框架中settings文件的部署建议
  6. WinCE的开发流程
  7. 筛选样本_早产预测准确性创新高!3种样本PK,首次利用脂质组学筛选出生物标志物...
  8. jvm最大最小内存参数设置
  9. halcon 旋转_HALCON高级篇:面阵相机模型及其坐标转换
  10. Beta版本测试第二天
  11. [ICLR18]联合句法和词汇学习的神经语言模型
  12. oracle的dbv命令,DBV(DBVERIFY)工具
  13. Photoshop是什么?
  14. 将视频的以flv格式转换mp4格式
  15. C语言中负数在计算机内部的二进制表示方式(以补码表示负数、整数的范围及所占字节数)
  16. day04-Testin云测平台操作
  17. 简单的五子棋程序(可悔棋版和普通版)
  18. 房租分期业务系统-抓住新的市场机遇
  19. STM32的IO口有幺蛾子(bug)
  20. linux安装pycharm报错:Unable to detect graphics environment

热门文章

  1. 操作系统课设--使用信号量解决生产者/消费者同步问题
  2. 数据结构--插入排序
  3. 76. 最小覆盖子串(滑动窗口)
  4. 02-缓存一致性---实现big.LITTLE、GPU 计算和企业应用
  5. [FF-A]-02-Concepts
  6. 1-Alternative Boot Flows
  7. 04-CA/TA编程:hash demo
  8. [Trustzone]-ARM Cortex-A Serial支持Trustzone和Hypervisor的总结
  9. OpenSSL“心脏出血”漏洞
  10. 打开指定大小的新窗口