java.net.URL 打開目標頁面連接。InputStream,包裝為 BufferedReader 逐行讀取。Pattern,逐行 Matcher.find() 提取匹配。package com.example.crawler;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EmailExtractor {
// 簡易郵箱正則:支援常見格式,不保證 100% RFC 合規
private static final String EMAIL_REGEX = "[a-zA-Z0-9_-]+@[a-zA-Z0-9]+(\\.[a-zA-Z0-9]+)+";
private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX);
public static void main(String[] args) {
String targetUrl = "https://www.example.com/contact"; // 替換為目標頁面
extractEmails(targetUrl).forEach(System.out::println);
}
public static java.util.List<String> extractEmails(String urlStr) {
java.util.List<String> emails = new java.util.ArrayList<>();
try {
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(10_000); // 10 秒連接超時
conn.setReadTimeout(10_000); // 10 秒讀取超時
// 模擬瀏覽器 User-Agent 避免 403
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "UTF-8"))) {
String line;
while ((line = reader.readLine()) != null) {
Matcher matcher = EMAIL_PATTERN.matcher(line);
while (matcher.find()) {
emails.add(matcher.group());
}
}
}
} catch (IOException e) {
System.err.println("抓取失敗:" + e.getMessage());
}
return emails;
}
}
[a-zA-Z0-9_-]+:本地部(@ 前)允許字母、數字、下劃線、連字符、點(此處簡化未含點)。@:字面 @。[a-zA-Z0-9]+(\\.[a-zA-Z0-9]+)+:域名部分,至少一個點分隔的標籤。局限:無法處理 HTML 實體編碼(@)、JS 動態生成、圖片/Canvas 嵌入的郵箱。生產級爬蟲建議使用 Jsoup 解析 DOM + 正則,或 HttpClient + 完整 HTML 解析器。
robots.txt 與服務條款。幾十行代碼即可實現基礎郵箱抓取,核心在於 URLConnection 流式讀取與 Pattern/Matcher 正則提取。實際專案中請根據頁面結構選擇更健壯的解析方案。