java 파충류 사이트 이미지 구현 실례 코드

첫 번째 단계, URL을 필터하고 저장하는 LinkQueue 구현

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; 
  } 
} 
3단계, 사진 다운로드 기능 구현

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"); 
  } 
} 
총결산
상기 서술한 것은 여러분께 소개해 드린 자바 실현 파충류 사이트 사진의 실례 코드입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기