From: https://mp.weixin.qq.com/s/rQf4bmHlSucAUlQy7jPNiQ
webmagic 是一個無須配置、便於二次開發的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實現一個爬蟲。
本項目在GitHub上有11.1K Star,非常熱門,讓不熟悉爬蟲的小白也可以玩轉爬蟲。
“申明:此教程僅供爬蟲學習交流使用,切忌非法使用爬蟲!
主要特色
- 完全模塊化的設計,強大的可擴展性。
- 核心簡單但是涵蓋爬蟲的全部流程,靈活而強大,也是學習爬蟲入門的好材料。
- 提供豐富的抽取頁面API。
- 無配置,但是可通過POJO+註解形式實現一個爬蟲。
- 支持多線程。
- 支持分佈式。
- 支持爬取js動態渲染的頁面。
- 無框架依賴,可以靈活的嵌入到項目中去。
歡迎關注公衆號:SpringForAll社區(spring4all.com),專注分享關於Spring的一切!回覆“加羣”還可加入Spring技術交流羣!
總體架構
WebMagic的結構分爲Downloader、PageProcessor、Scheduler、Pipeline四大組件,並由Spider將它們彼此組織起來。這四大組件對應爬蟲生命週期中的下載、處理、管理和持久化等功能。
快速開始
引入依賴
webmagic使用maven管理依賴,在項目中添加對應的依賴即可使用webmagic:
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.5</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.5</version>
</dependency>
WebMagic 使用slf4j-log4j12作爲slf4j的實現.如果你自己定製了slf4j的實現,請在項目中去掉此依賴。
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
第一個爬蟲
定製PageProcessor
PageProcessor是webmagic-core的一部分,定製一個PageProcessor即可實現自己的爬蟲邏輯。
以下是抓取osc博客的一段代碼:
public class OschinaBlogPageProcessor implements PageProcessor {
private Site site = Site.me().setDomain("my.oschina.net");
@Override
public void process(Page page) {
List<String> links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").all();
page.addTargetRequests(links);
page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1").toString());
page.putField("content", page.getHtml().$("div.content").toString());
page.putField("tags",page.getHtml().xpath("//div[@class='BlogTags']/a/text()").all());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new OschinaBlogPageProcessor()).addUrl("http://my.oschina.net/flashsword/blog")
.addPipeline(new ConsolePipeline()).run();
}
}
這裏通過page.addTargetRequests()
方法來增加要抓取的URL,並通過page.putField()
來保存抽取結果。page.getHtml().xpath()
則是按照某個規則對結果進行抽取,這裏抽取支持鏈式調用。調用結束後,toString()
表示轉化爲單個String,all()
則轉化爲一個String列表。
Spider是爬蟲的入口類。Pipeline是結果輸出和持久化的接口,這裏ConsolePipeline表示結果輸出到控制檯。
執行這個main方法,即可在控制檯看到抓取結果。webmagic默認有3秒抓取間隔,請耐心等待。
使用註解
webmagic-extension包括了註解方式編寫爬蟲的方法,只需基於一個POJO增加註解即可完成一個爬蟲。以下仍然是抓取oschina博客的一段代碼,功能與OschinaBlogPageProcesser
完全相同:
@TargetUrl("http://my.oschina.net/flashsword/blog/\\d+")
public class OschinaBlog {
@ExtractBy("//title")
private String title;
@ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css)
private String content;
@ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true)
private List<String> tags;
public static void main(String[] args) {
OOSpider.create(
Site.me(),
new ConsolePageModelPipeline(), OschinaBlog.class).addUrl("http://my.oschina.net/flashsword/blog").run();
}
}
這個例子定義了一個Model類,Model類的字段'title'、'content'、'tags'均爲要抽取的屬性。這個類在Pipeline裏是可以複用的。
開源地址
- https://github.com/code4craft/webmagic
給大家推薦我們團隊開發的Chrome插件:YouTube中文配音。如果您跟我們一樣,熱愛看國外的視頻學習前沿知識或者其他內容,該插件可以很好的幫助您講外語視頻一鍵轉化爲中文視頻,官網:https://www.youtube-dubbing.com/
END