在數據採集、線索挖掘、安全審計等場景中,常需要從目標頁面抓取所有郵箱地址。本文實現一個輕量級爬蟲:URL.openStream() 讀取 HTML → 逐行正則匹配 → 去重輸出。
public class EmailExtractor {
// RFC 5322 簡化版郵箱正則,覆蓋 99% 常見格式
private static final Pattern EMAIL_PATTERN = Pattern.compile(
"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"
);
public static void extract(String urlStr) {
System.out.println("開始抓取:" + urlStr);
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new URL(urlStr).openStream(), StandardCharsets.UTF_8))) {
String line;
Set emails = new LinkedHashSet<>(); // 保序去重
while ((line = reader.readLine()) != null) {
Matcher matcher = EMAIL_PATTERN.matcher(line);
while (matcher.find()) {
emails.add(matcher.group().toLowerCase());
}
}
emails.forEach(System.out::println);
System.out.printf("共提取 %d 個唯一郵箱%n", emails.size());
} catch (IOException e) {
System.err.println("抓取失敗:" + e.getMessage());
}
}
public static void main(String[] args) {
// 示例:百度貼吧頁面(需替換為真實目標)
extract("https://tieba.baidu.com/f?kw=java&ie=utf-8");
}
}
| 技術點 | 說明 |
|---|---|
| 編碼處理 | 显式指定 StandardCharsets.UTF_8,避免中文頁面亂碼 |
| 正則優化 | 使用 Pattern.compile 預編譯,避免循環中重複編譯 |
| 去重策略 | LinkedHashSet 兼顧去重與輸出順序 |
| 資源管理 | try-with-resources 自動關閉流,防止句柄洩漏 |
上述方案僅適用於靜態 HTML。現代網頁常見難點及對策:
URLConnection.setRequestProperty("User-Agent", "Mozilla/5.0...") 模擬瀏覽器;CookieManager 自動處理會話;⚠️ 重要提醒:郵箱屬於個人隱私信息。《網絡安全法》、《個人信息保護法》及《反不正當競爭法》均對非法採集、買賣個人信息有嚴格限制。本代碼僅供技術學習、授權範圍內的數據分析使用,嚴禁用於垃圾郵件發送、詐騙線索收集等違法用途。
Java 實現靜態頁面郵箱提取僅需 30 行核心代碼,關鍵在於正則精準度與編碼處理。面對動態頁面,建議升級為 Headless Browser 方案;生產環境務必遵守法律法規與 robots.txt 協議。