網路爬蟲能自動遍歷網站鏈結繪製頁面地圖。Java 內建 HTTP 協定支援與 HTML 解析器,是開發爬蟲的理想語言。本文展示可復用 Spider 類別架構、回呼介面設計,並以死連結檢測為例說明應用方式。
// 回呼介面:爬蟲透過此介面將事件通知應用層
public interface ISpiderReportable {
boolean spiderFoundURL(URL base, URL url); // 發現新 URL,返回 true 表示繼續追蹤
void spiderURLError(URL url); // URL 存取錯誤
void spiderFoundEMail(String email); // 發現電子郵件
}
維護三組 URL 集合:
workloadWaiting:待處理佇列workloadProcessed:已處理集合workloadError:錯誤集合public void begin() {
cancel = false;
while (!workloadWaiting.isEmpty() && !cancel) {
URL[] urls = workloadWaiting.toArray(new URL[0]);
for (URL url : urls) {
if (cancel) break;
processURL(url);
}
}
}
利用 Swing 內建 HTMLEditorKit.Parser,因 getParser() 為 protected,需子類別暴露:
public class HTMLParse extends HTMLEditorKit {
public HTMLEditorKit.Parser getParser() { return super.getParser(); }
}
解析回呼類別 Parser 繼承 HTMLEditorKit.ParserCallback,重寫 handleSimpleTag、handleStartTag 提取 href/src 屬性,將相對 URL 轉為絕對 URL 後加入待處理佇列。
public class CheckLinks extends JFrame implements Runnable, ISpiderReportable {
// UI 元件:URL 輸入框、開始/取消按鈕、進度標籤、統計標籤、錯誤滾動文字區
// 背景執行緒執行爬蟲,SwingUtilities.invokeLater 更新 UI
@Override
public boolean spiderFoundURL(URL base, URL url) {
updateStatus(url.toString());
if (!checkLink(url)) { // 開啟連線驗證
logError(url + " (on page " + base + ")");
badLinksCount++;
return false; // 不追蹤死連結
}
goodLinksCount++;
return url.getHost().equalsIgnoreCase(base.getHost()); // 同域才繼續爬
}
protected boolean checkLink(URL url) {
try { url.openConnection().connect(); return true; }
catch (IOException e) { return false; }
}
// ... spiderURLError、spiderFoundEMail 空實作
}
| 檔案 | 職責 |
|---|---|
| ISpiderReportable.java | 事件回呼介面 |
| Spider.java | 核心爬蟲邏輯:佇列管理、HTTP 存取、HTML 解析調度 |
| HTMLParse.java | 暴露受保護的 Parser 取得方法 |
| CheckLinks.java | GUI 應用:實作介面、啟動背景執行緒、死連結檢測邏輯 |
robots.txt 遵從檢查Jsoup 等更強健的 HTML 解析庫