webTools.IOTOWeb ← 百度音樂榜單爬蟲
webTools.GetBook ← 金書網書籍資訊爬蟲
dbTools.DBTools ← JDBC 封裝(PreparedStatement + 連線管理)
controller.TestURL ← Servlet 觸發百度爬蟲
controller.TestBook ← Servlet 觸發金書爬蟲(含重試邏輯)
getHtmlContent(url):URL.openStream() + BufferedReader 讀取原始 HTML(指定 GB2312 編碼)getMainContent():正則擷取 <table class="list">...</table> 區塊getLink():擷取每行 <td> 完整標籤getSongName() / getPerson() / getHref():細部正則提取歌名、歌手、連結outTag():replaceAll("<.*?>", "") 移除 HTML 標籤DBTools.update():參數化 SQL 寫入 MySQL// 主表格
String tableRegex = "<table width=\"100%\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"list\">(.*?)</table>";
// 每行 td
String tdRegex = "<td[^>]*>[\\(]*<a[^>]*href=(\"([^\"]*)\"|'([^']*)'|([^\\s>]*))[^>]*>(.*?)[\\)]*[\\s]*</td>";
// 歌名
String songRegex = "<a[^>]*href=(\"([^\"]*)\"|'([^']*)'|([^\\s>]*))[^>]*>(.*?)</a>\\s";
// 歌手(括號內)
String personRegex = "\\(<a[^>]*href=(\"([^\"]*)\"|'([^']*)'|([^\\s>]*))[^>]*>(.*?)\\)";
// 連結
String hrefRegex = "href=(\"([^\"]*)\"|'([^']*)'|([^\\s>]*))\"";
public class DBTools {
private static final String URL = "jdbc:mysql://localhost:3306/TestURL?useSSL=false&serverTimezone=Asia/Taipei";
private static final String USER = "root";
private static final String PASS = "zhuyi";
static { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (Exception e) { throw new RuntimeException(e); } }
public void update(String sql, List
@WebServlet("/crawl/baidu")
public class CrawlBaiduServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
new Thread(() -> {
try {
new IOTOWeb().getFromBaiduMap3("https://list.mp3.baidu.com/topso/mp3topsong.html?id=1?top2");
log("百度爬蟲完成");
} catch (Exception e) {
log("百度爬蟲失敗", e);
}
}).start();
resp.getWriter().write("爬蟲已在背景啟動");
}
}
https://www.golden-book.com/booksinfo/12/{id}.html<span class="style15">書名</span>i++ → 遞迴呼叫 doPost/doGet(⚠️ 易造成堆疊溢位,建議改用迴圈)| 層面 | 現狀 | 建議升級 |
|---|---|---|
| HTTP Client | URL.openStream() | Apache HttpClient 5 / OkHttp / Java 11 HttpClient | HTML 解析 | Regex | Jsoup (CSS Selector) - 穩健、可維護 | 資料庫 | 手寫 JDBC | HikariCP + MyBatis / JdbcTemplate / JPA | 排程 | Servlet + Thread | Spring @Scheduled / Quartz / Spring Batch | 編碼處理 | 硬編碼 GB2312 | 自動偵測 Content-Type / HTML meta charset | 錯誤處理 | printStackTrace / 遞迴重試 | 統一例外處理、指數退避、死信隊列、監控告警 |
robots.txt、服務條款與爬蟲頻率限制。User-Agent、Referer、隨機延遲、IP 代理池。本範例展示了「HTTP 取得 → 正則解析 → JDBC 入庫 → Servlet 觸發」的完整爬蟲鏈路。理解基礎原理後,強烈建議採用現代化框架重構,提升穩定性、可維護性與合規性。