import javax.swing.text.html.*;/** * Swing JEditorPane 文本组件通过称为 EditorKit 的插件机制来支持不同种类的内容。因为 HTML * 是很流行的内容格式,因此默认提供了某种支持。此类提供了 HTML version 3.2(带有某些扩展)的默认支持,并正在向 version 4.0 * 迁移。不支持 标记,但为
import java.net.*;public interface ISpiderReportable { // 找到URL链接 public boolean spiderFoundURL(URL base, URL url); public void spiderURLError(URL url); // 找到Email的链接 public void spiderFoundEMail(String email);}
import java.util.*;import java.net.*;import java.io.*;import javax.swing.text.*;import javax.swing.text.html.*;public class Spider { // 装载错误的工作集 protected Collection workloadError = new ArrayList(3); // 等待工作集 protected Collection workloadWaiting = new ArrayList(3); // 已处理的工作集 protected Collection workloadProcessed = new ArrayList(3); protected ISpiderReportable report; protected boolean cancel = false; public Spider(ISpiderReportable report) { this.report = report; } public Collection getWorkloadError() { return workloadError; } public Collection getWorkloadWaiting() { return workloadWaiting; } public Collection getWorkloadProcessed() { return workloadProcessed; } public void clear() { getWorkloadError().clear(); getWorkloadWaiting().clear(); getWorkloadProcessed().clear(); } public void cancel() { cancel = true; } public void addURL(URL url) { if (getWorkloadWaiting().contains(url))// 如果等待的工作集中已经包含该URL,返回 return; if (getWorkloadError().contains(url))// 如果出错的工作集中已经包含该URL,返回 return; if (getWorkloadProcessed().contains(url))// 如果已处理的工作集中包含该URL,返回 return; log("Adding to workload: " + url); getWorkloadWaiting().add(url);// 将其加入等待的工作集中 } // 具体分析URL的方法 public void processURL(URL url) { try { log("Processing: " + url);// 控制台打印处理的URL地址 // get the URL's contents URLConnection connection = url.openConnection(); System.out.println(connection.getContentType() + "++++++++++++++++===="); if ((connection.getContentType() != null) && !connection.getContentType().toLowerCase().startsWith("text/")) { getWorkloadWaiting().remove(url); getWorkloadProcessed().add(url); log("Not processing because content type is: " + connection.getContentType()); return; } // read the URL InputStream is = connection.getInputStream(); Reader r = new InputStreamReader(is); // parse the URL HTMLEditorKit.Parser parse = new HTMLParse().getParser(); // Parse the given stream and drive the given callback with the // results of the parse. This method should be implemented to be // thread-safe. // 解析给定的流并通过解析的结果驱动给定的回调。该方法执行完之后,会调用给定的回调函数 parse.parse(r, new Parser(url), true); } catch (IOException e) {// 如果出错 getWorkloadWaiting().remove(url);// 从工作集中移除URL getWorkloadError().add(url);// 将出错的URL加入错误的工作集 log("Error: " + url); report.spiderURLError(url);// 报告该出错的URL return; } // mark URL as complete getWorkloadWaiting().remove(url); getWorkloadProcessed().add(url); log("Complete: " + url); } // 蜘蛛工作的方法,只要等待工作集不为空,并且标志位为false,那么一直从集合中取出URL public void begin() { cancel = false; while (!getWorkloadWaiting().isEmpty() && !cancel) { Object list[] = getWorkloadWaiting().toArray(); for (int i = 0; (i < list.length) && !cancel; i++) processURL((URL) list[i]);// 调用分析URL的方法 } } protected class Parser extends HTMLEditorKit.ParserCallback { protected URL base; public Parser(URL base) { this.base = base; } public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet mutableAttributeSet, int pos) { String href = (String) mutableAttributeSet.getAttribute(HTML.Attribute.HREF);// 获取href链接 if ((href == null) && (tag == HTML.Tag.FRAME)) href = (String) mutableAttributeSet.getAttribute(HTML.Attribute.SRC); if (href == null) return; int i = href.indexOf('#'); if (i != -1) href = href.substring(0, i);// 开始截取到'#'字符 if (href.toLowerCase().startsWith("mailto:")) {// 如果是邮件链接 report.spiderFoundEMail(href); return; } if (tag == HTML.Tag.META) { String title = (String) mutableAttributeSet.getAttribute(HTML.Attribute.NAME); System.out.println("title:" + title); } // 处理新得到的链接 handleLink(base, href); } public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) { handleSimpleTag(t, a, pos); // handle the same way } // 处理链接的函数 protected void handleLink(URL base, String str) { try { URL url = new URL(base, str); // 判断,如果属于同一主机,加入待处理工作集 if (report.spiderFoundURL(base, url)) addURL(url); } catch (MalformedURLException e) { log("Found malformed URL: " + str); } } } public void log(String entry) { System.out.println((new Date()) + ":" + entry); }}