java实现爬虫爬网站图片的实例代码
第一步,实现LinkQueue,对url进行过滤和存储的操作
importjava.util.ArrayList; importjava.util.Collections; importjava.util.HashSet; importjava.util.List; importjava.util.Set; publicclassLinkQueue{ //已访问的url集合 privatestaticSetvisitedUrl=Collections.synchronizedSet(newHashSet ()); //未访问的url privatestaticList unVisitedUrl=Collections.synchronizedList(newArrayList ()); //未访问的URL出队列 publicstaticStringunVisitedUrlDeQueue(){ if(unVisitedUrl.size()>0){ Stringurl=unVisitedUrl.remove(0); visitedUrl.add(url); returnurl; } returnnull; } //新的url添加进来的时候进行验证,保证只是添加一次 publicstaticvoidaddUnvisitedUrl(Stringurl){ if(url!=null&&!url.trim().equals("")&&!visitedUrl.contains(url) &&!unVisitedUrl.contains(url)) unVisitedUrl.add(url); } //判断未访问的URL队列中是否为空 publicstaticbooleanunVisitedUrlsEmpty(){ returnunVisitedUrl.isEmpty(); } }
第二步,收集每一个url下的链接进行过滤产生新的链接
importjava.util.HashSet; importjava.util.Set; importorg.htmlparser.Node; importorg.htmlparser.NodeFilter; importorg.htmlparser.Parser; importorg.htmlparser.filters.NodeClassFilter; importorg.htmlparser.filters.OrFilter; importorg.htmlparser.tags.LinkTag; importorg.htmlparser.util.NodeList; importorg.htmlparser.util.ParserException; /** *过滤http的url,获取可以符合规则的url *@authorAdministrator * */ publicclassParserHttpUrl{ //获取一个网站上的链接,filter用来过滤链接 publicstaticSetextracLinks(Stringurl,LinkFilterfilter){ Set links=newHashSet (); try{ Parserparser=newParser(url); //过滤标签的filter,用来提取frame标签里的src属性所表示的链接 NodeFilterframeFilter=newNodeFilter(){ publicbooleanaccept(Nodenode){ if(node.getText().startsWith("framesrc=")){ returntrue; }else{ returnfalse; } } }; //OrFilter来设置过滤标签,和标签 OrFilterlinkFilter=newOrFilter(newNodeClassFilter( LinkTag.class),frameFilter); //得到所有经过过滤的标签 NodeListlist=parser.extractAllNodesThatMatch(linkFilter); for(inti=0;i 标签 { LinkTaglink=(LinkTag)tag; StringlinkUrl=link.getLink();//url if(filter.accept(linkUrl)) links.add(linkUrl); }else//标签 { //提取frame里src属性的链接如 Stringframe=tag.getText(); intstart=frame.indexOf("src="); frame=frame.substring(start); intend=frame.indexOf(""); if(end==-1) end=frame.indexOf(">"); StringframeUrl=frame.substring(5,end-1); if(filter.accept(frameUrl)) links.add(frameUrl); } } }catch(ParserExceptione){ e.printStackTrace(); } returnlinks; } }
第三步,实现图片下载功能
importjava.io.File; importjava.io.FileOutputStream; importjava.io.InputStream; importjava.net.URL; importjava.net.URLConnection; importjava.util.ArrayList; importjava.util.List; importjava.util.regex.Matcher; importjava.util.regex.Pattern; /*** *java抓取网络图片 * *@authorswinglife * */ publicclassDownLoadPic{ //编码 privatestaticfinalStringECODING="UTF-8"; //获取img标签正则 privatestaticfinalStringIMGURL_REG="]*?>"; //获取src路径的正则 privatestaticfinalStringIMGSRC_REG="http:\"?(.*?)(\"|>|\\s+)"; publicstaticvoiddownloadPic(Stringurl){ //获得html文本内容 StringHTML=null; try{ HTML=DownLoadPic.getHTML(url); }catch(Exceptione){ e.printStackTrace(); } if(null!=HTML&&!"".equals(HTML)){ //获取图片标签 List imgUrl=DownLoadPic.getImageUrl(HTML); //获取图片src地址 List imgSrc=DownLoadPic.getImageSrc(imgUrl); //下载图片 DownLoadPic.download(imgSrc); } } /*** *获取HTML内容 * *@paramurl *@return *@throwsException */ privatestaticStringgetHTML(Stringurl)throwsException{ URLuri=newURL(url); URLConnectionconnection=uri.openConnection(); InputStreamin=connection.getInputStream(); byte[]buf=newbyte[1024]; intlength=0; StringBuffersb=newStringBuffer(); while((length=in.read(buf,0,buf.length))>0){ sb.append(newString(buf,ECODING)); } in.close(); returnsb.toString(); } /*** *获取ImageUrl地址 * *@paramHTML *@return */ privatestaticList getImageUrl(StringHTML){ Matchermatcher=Pattern.compile(IMGURL_REG).matcher(HTML); List listImgUrl=newArrayList (); while(matcher.find()){ listImgUrl.add(matcher.group()); } returnlistImgUrl; } /*** *获取ImageSrc地址 * *@paramlistImageUrl *@return */ privatestaticList getImageSrc(List listImageUrl){ List listImgSrc=newArrayList (); for(Stringimage:listImageUrl){ Matchermatcher=Pattern.compile(IMGSRC_REG).matcher(image); while(matcher.find()){ listImgSrc.add(matcher.group().substring(0, matcher.group().length()-1)); } } returnlistImgSrc; } /*** *下载图片 * *@paramlistImgSrc */ privatestaticvoiddownload(List listImgSrc){ for(Stringurl:listImgSrc){ try{ StringimageName=url.substring(url.lastIndexOf("/")+1, url.length()); URLuri=newURL(url); InputStreamin=uri.openStream(); FileOutputStreamfo=newFileOutputStream(newFile(imageName)); byte[]buf=newbyte[1024]; intlength=0; while((length=in.read(buf,0,buf.length))!=-1){ fo.write(buf,0,length); } in.close(); fo.close(); }catch(Exceptione){ e.printStackTrace(); } } } }
实在Filter接口,定义过滤接口:
publicinterfaceFilter{ publicbooleanaccept(Stringurl); }
第四步,过滤规则的实现:
publicclassCrawler{ /** *抓取过程 * *@return *@paramseeds */ publicvoidcrawling(Stringurl){//定义过滤器 Filterfilter=newFilter(){ publicbooleanaccept(Stringurl){ //这里过滤规则随需要爬的网站的规则进行改变,推荐使用正则实现,本人是爬豆瓣网站 if(url.indexOf("douban.com/group/topic")!=-1||url.indexOf("douban.com/group/haixiuzu/discussion?start")!=-1) returntrue; else returnfalse; } }; //初始化URL队列 LinkQueue.addUnvisitedUrl(url); //循环条件,待抓取的链接不空 while(!LinkQueue.unVisitedUrlsEmpty()){ //队头URL出队列 StringvisitUrl=(String)LinkQueue.unVisitedUrlDeQueue(); if(visitUrl==null) continue; DownLoadPic.downloadPic(visitUrl); //提取出下载网页中的URL Setlinks=ParserHttpUrl.extracLinks(visitUrl,filter); //新的未访问的URL入队 for(Stringlink:links){ LinkQueue.addUnvisitedUrl(link); } } } //main方法入口 publicstaticvoidmain(String[]args){ Crawlercrawler=newCrawler(); crawler.crawling("http://www.douban.com/group/haixiuzu/discussion?start=0"); } }
总结
以上所述是小编给大家介绍的java实现爬虫爬网站图片的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。