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
privatestaticListunVisitedUrl=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){
Setlinks=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)){
//获取图片标签
ListimgUrl=DownLoadPic.getImageUrl(HTML);
//获取图片src地址
ListimgSrc=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
*/
privatestaticListgetImageUrl(StringHTML){
Matchermatcher=Pattern.compile(IMGURL_REG).matcher(HTML);
ListlistImgUrl=newArrayList();
while(matcher.find()){
listImgUrl.add(matcher.group());
}
returnlistImgUrl;
}
/***
*获取ImageSrc地址
*
*@paramlistImageUrl
*@return
*/
privatestaticListgetImageSrc(ListlistImageUrl){
ListlistImgSrc=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(ListlistImgSrc){
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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。