欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现爬虫爬网站图片的实例代码

程序员文章站 2023-12-19 19:50:22
第一步,实现 linkqueue,对url进行过滤和存储的操作 import java.util.arraylist; import java.util.co...

第一步,实现 linkqueue,对url进行过滤和存储的操作

import java.util.arraylist; 
import java.util.collections; 
import java.util.hashset; 
import java.util.list; 
import java.util.set; 
public class linkqueue { 
  // 已访问的 url 集合 
  private static set<string> visitedurl = collections.synchronizedset(new hashset<string>()); 
  // 未访问的url 
  private static list<string> unvisitedurl = collections.synchronizedlist(new arraylist<string>()); 
  // 未访问的url出队列 
  public static string unvisitedurldequeue() { 
    if (unvisitedurl.size() > 0) { 
      string url = unvisitedurl.remove(0); 
      visitedurl.add(url); 
      return url; 
    } 
    return null; 
  } 
  // 新的url添加进来的时候进行验证,保证只是添加一次 
  public static void addunvisitedurl(string url) { 
    if (url != null && !url.trim().equals("") && !visitedurl.contains(url) 
        && !unvisitedurl.contains(url)) 
      unvisitedurl.add(url); 
  } 
  // 判断未访问的url队列中是否为空 
  public static boolean unvisitedurlsempty() { 
    return unvisitedurl.isempty(); 
  } 
} 

第二步,收集每一个url下的链接进行过滤产生新的链接

import java.util.hashset; 
import java.util.set; 
import org.htmlparser.node; 
import org.htmlparser.nodefilter; 
import org.htmlparser.parser; 
import org.htmlparser.filters.nodeclassfilter; 
import org.htmlparser.filters.orfilter; 
import org.htmlparser.tags.linktag; 
import org.htmlparser.util.nodelist; 
import org.htmlparser.util.parserexception; 
/** 
 * 过滤http的url,获取可以符合规则的url 
 * @author administrator 
 * 
 */ 
public class parserhttpurl { 
  // 获取一个网站上的链接,filter 用来过滤链接 
  public static set<string> extraclinks(string url, linkfilter filter) { 
    set<string> links = new hashset<string>(); 
    try { 
      parser parser = new parser(url); 
      // 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接 
      nodefilter framefilter = new nodefilter() { 
        public boolean accept(node node) { 
          if (node.gettext().startswith("frame src=")) { 
            return true; 
          } else { 
            return false; 
          } 
        } 
      }; 
      // orfilter 来设置过滤 <a> 标签,和 <frame> 标签 
      orfilter linkfilter = new orfilter(new nodeclassfilter( 
          linktag.class), framefilter); 
      // 得到所有经过过滤的标签 
      nodelist list = parser.extractallnodesthatmatch(linkfilter); 
      for (int i = 0; i < list.size(); i++) { 
        node tag = list.elementat(i); 
        if (tag instanceof linktag)// <a> 标签 
        { 
          linktag link = (linktag) tag; 
          string linkurl = link.getlink();// url 
          if (filter.accept(linkurl)) 
            links.add(linkurl); 
        } else// <frame> 标签 
        { 
          // 提取 frame 里 src 属性的链接如 <frame src="test.html"/> 
          string frame = tag.gettext(); 
          int start = frame.indexof("src="); 
          frame = frame.substring(start); 
          int end = frame.indexof(" "); 
          if (end == -1) 
            end = frame.indexof(">"); 
          string frameurl = frame.substring(5, end - 1); 
          if (filter.accept(frameurl)) 
            links.add(frameurl); 
        } 
      } 
    } catch (parserexception e) { 
      e.printstacktrace(); 
    } 
    return links; 
  } 
} 

第三步,实现图片下载功能 

import java.io.file; 
import java.io.fileoutputstream; 
import java.io.inputstream; 
import java.net.url; 
import java.net.urlconnection; 
import java.util.arraylist; 
import java.util.list; 
import java.util.regex.matcher; 
import java.util.regex.pattern; 
/*** 
 * java抓取网络图片 
 * 
 * @author swinglife 
 * 
 */ 
public class downloadpic { 
  // 编码 
  private static final string ecoding = "utf-8"; 
  // 获取img标签正则 
  private static final string imgurl_reg = "<img.*src=(.*?)[^>]*?>"; 
  // 获取src路径的正则 
  private static final string imgsrc_reg = "http:\"?(.*?)(\"|>|\\s+)"; 
  public static void downloadpic(string url) { 
    // 获得html文本内容 
    string html = null; 
    try { 
      html = downloadpic.gethtml(url); 
    } catch (exception e) { 
      e.printstacktrace(); 
    } 
    if (null != html && !"".equals(html)) { 
      // 获取图片标签 
      list<string> imgurl = downloadpic.getimageurl(html); 
      // 获取图片src地址 
      list<string> imgsrc = downloadpic.getimagesrc(imgurl); 
      // 下载图片 
      downloadpic.download(imgsrc); 
    } 
  } 
  /*** 
   * 获取html内容 
   * 
   * @param url 
   * @return 
   * @throws exception 
   */ 
  private static string gethtml(string url) throws exception { 
    url uri = new url(url); 
    urlconnection connection = uri.openconnection(); 
    inputstream in = connection.getinputstream(); 
    byte[] buf = new byte[1024]; 
    int length = 0; 
    stringbuffer sb = new stringbuffer(); 
    while ((length = in.read(buf, 0, buf.length)) > 0) { 
      sb.append(new string(buf, ecoding)); 
    } 
    in.close(); 
    return sb.tostring(); 
  } 
  /*** 
   * 获取imageurl地址 
   * 
   * @param html 
   * @return 
   */ 
  private static list<string> getimageurl(string html) { 
    matcher matcher = pattern.compile(imgurl_reg).matcher(html); 
    list<string> listimgurl = new arraylist<string>(); 
    while (matcher.find()) { 
      listimgurl.add(matcher.group()); 
    } 
    return listimgurl; 
  } 
  /*** 
   * 获取imagesrc地址 
   * 
   * @param listimageurl 
   * @return 
   */ 
  private static list<string> getimagesrc(list<string> listimageurl) { 
    list<string> listimgsrc = new arraylist<string>(); 
    for (string image : listimageurl) { 
      matcher matcher = pattern.compile(imgsrc_reg).matcher(image); 
      while (matcher.find()) { 
        listimgsrc.add(matcher.group().substring(0, 
            matcher.group().length() - 1)); 
      } 
    } 
    return listimgsrc; 
  } 
  /*** 
   * 下载图片 
   * 
   * @param listimgsrc 
   */ 
  private static void download(list<string> listimgsrc) { 
    for (string url : listimgsrc) { 
      try { 
        string imagename = url.substring(url.lastindexof("/") + 1, 
            url.length()); 
        url uri = new url(url); 
        inputstream in = uri.openstream(); 
        fileoutputstream fo = new fileoutputstream(new file(imagename)); 
        byte[] buf = new byte[1024]; 
        int length = 0; 
        while ((length = in.read(buf, 0, buf.length)) != -1) { 
          fo.write(buf, 0, length); 
        } 
        in.close(); 
        fo.close(); 
      } catch (exception e) { 
        e.printstacktrace(); 
      } 
    } 
  } 
} 

实在filter接口,定义过滤接口:

public interface filter { 
  public boolean accept(string url); 
} 

第四步,过滤规则的实现:

public class crawler { 
  /** 
   * 抓取过程 
   * 
   * @return 
   * @param seeds 
   */ 
  public void crawling(string url) { // 定义过滤器 
    filter filter = new filter() { 
      public boolean accept(string url) { 
        //这里过滤规则随需要爬的网站的规则进行改变,推荐使用正则实现,本人是爬豆瓣网站 
        if(url.indexof("douban.com/group/topic") != -1 || url.indexof("douban.com/group/haixiuzu/discussion?start") != -1 ) 
          return true; 
        else 
          return false; 
      } 
    }; 
    // 初始化 url 队列 
    linkqueue.addunvisitedurl(url); 
    // 循环条件,待抓取的链接不空 
    while (!linkqueue.unvisitedurlsempty()) { 
      // 队头url出队列 
      string visiturl = (string) linkqueue.unvisitedurldequeue(); 
      if (visiturl == null) 
        continue; 
      downloadpic.downloadpic(visiturl); 
      // 提取出下载网页中的 url 
      set<string> links = parserhttpurl.extraclinks(visiturl, filter); 
      // 新的未访问的 url 入队 
      for (string link : links) { 
        linkqueue.addunvisitedurl(link); 
      } 
    } 
  } 
  // main 方法入口 
  public static void main(string[] args) { 
    crawler crawler = new crawler(); 
    crawler.crawling("http://www.douban.com/group/haixiuzu/discussion?start=0"); 
  } 
} 

总结

以上所述是小编给大家介绍的java实现爬虫爬网站图片的实例代码,希望对大家有所帮助

上一篇:

下一篇: