WebMagic(us.codecraft.webmagic)是國產輕量級爬蟲框架,設計靈感來自 Python Scrapy。核心組件:Spider(引擎)、PageProcessor(頁面解析邏輯)、Downloader(下載)、Pipeline(結果持久化)。本範例抓取某電影海報站的標題與圖片 URL。
public class MoviePaperPageProcessor implements PageProcessor {
// 站點配置:重試 3 次、間隔 1 秒
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
@Override public Site getSite() { return site; }
@Override public void process(Page page) {
// 1. 提取列表頁連結(正則過濾),去重後加入待抓取隊列
List<String> links = page.getHtml().links()
.regex("https://posters\\.aa\\.com/poster/\\d+").all();
links = removeDuplicate(links);
page.addTargetRequests(links);
// 2. 詳情頁解析:XPath 選擇器提取標題與圖片
page.putField("title", page.getHtml()
.xpath("//div[@id='imdbleftsecc']/center/h1/text()").toString());
page.putField("imgurl", page.getHtml()
.xpath("//div[@id='imdbleftsecc']/center/img/@src").toString());
// 3. 結果將自動流入 Pipeline(需另行配置 ConsolePipeline、FilePipeline、DB 等)
}
// 簡單去重
public static List<String> removeDuplicate(List<String> list) {
return new ArrayList<>(new HashSet<>(list));
}
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
Spider.create(new MoviePaperPageProcessor())
.addUrl("https://posters.aa.co/poster_page/" + i)
.thread(5) // 5 執行緒並發
.run();
}
}
}
| API | 用途 |
|---|---|
page.getHtml().links().regex(...).all() | 提取所有 <a href> 並正則過濾 |
page.getHtml().xpath(...).toString() | XPath 單值提取(首個匹配) |
page.putField(key, value) | 將解析結果放入 ResultItems 供 Pipeline 使用 |
page.addTargetRequests(urls) | 動態發現新 URL 加入調度隊列 |
Spider.thread(n) | 設定下載/解析執行緒數 |
Pipeline 介面存入 MySQL/ElasticSearch/MinIO,或用內建 FilePipeline、JsonFilePipeline。Site 設定 User-Agent、Cookie、Proxy;整合 SeleniumDownloader 處理 JS 渲染頁面。Redis(RedisScheduler、RedisPipeline)實現多節點協作去重。SpiderListener 記錄生命週期事件。robots.txt、限制頻率、檢查法律風險。<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>1.2.1</version> <!-- 查詢最新版 -->
</dependency>
<dependency> <!-- XPath 支援需額外引入 -->
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>1.2.1</version>
</dependency>