WebMagic的設計參考了業界最優秀的爬蟲Scrapy,而實現則應用了HttpClient、Jsoup等Java世界最成熟的工具。其官網地址:http://webmagic.io/docs/zh/posts/ch1-overview/css
教程內容很豐富,詳盡,下面是一個快速使用的例子:java
首先是pom文件須要引入git
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
若是你以前引入了slf4j,這裏須要將slf4j的包排除,省得包衝突。web
測試代碼以下,裏面有詳盡的解釋:正則表達式
/** * @author panmingshuai * @description * @Time 2018年3月16日 下午2:46:28 * */ public class TestGithub implements PageProcessor { // 部分一:抓取網站的相關配置,包括編碼、抓取間隔、重試次數等 private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override // process是定製爬蟲邏輯的核心接口,在這裏編寫抽取邏輯 public void process(Page page) { // 部分二:定義如何抽取頁面信息,並保存下來 page.putField("author", page.getUrl().regex("https://gitee\\.com/(\\w+)/.*").toString());//這裏使用了正則匹配 page.putField("url", page.getUrl().toString()); /** * XPath原本是用於XML中獲取元素的一種查詢語言,可是用於Html也是比較方便的 * 這裏使用了xpath匹配 */ String projectName = page.getHtml().xpath("//span[@class='project-title']/a[@class='repository']/@href").toString(); if(StringUtils.isNotBlank(projectName)){ String projectName2 = new StringBuilder(projectName).reverse().toString(); projectName2 = projectName2.substring(0, projectName2.indexOf("/")); String projectName3 = new StringBuilder(projectName2).reverse().toString(); page.putField("projectName", projectName3); } if (page.getResultItems().get("projectName")==null){ //若是取不到項目名,說明該頁不是項目頁,跳過此頁 page.setSkip(true); } page.putField("readme", page.getHtml().xpath("//span[@class='git-project-desc-text']/text()")); // 部分三:從頁面發現後續的url地址來抓取 /** * 這段代碼的分爲兩部分,page.getHtml().links().regex("(https://gitee\\.com/[\\w\\-]+/[\\w\\-]+)").all() * 用於獲取全部知足"(https://gitee\\.com/[\\w\\-]+/[\\w\\-]+)"這個正則表達式的連接, * page.addTargetRequests()則將這些連接加入到待抓取的隊列中去。 */ page.addTargetRequests(page.getHtml().links().regex("(https://gitee\\.com/[\\w\\-]+/[\\w\\-]+)").all()); } @Override public Site getSite() { return site; } public static void main(String[] args) throws JMException { Spider osSpider = Spider.create(new TestGithub()) /** * WebMagic用於保存結果的組件叫作Pipeline。例如咱們經過「控制檯輸出結果」這件事也是經過一個內置的Pipeline完成的, * 它叫作ConsolePipeline。那麼,我如今想要把結果用Json的格式保存下來,怎麼作呢? * 只須要將Pipeline的實現換成"JsonFilePipeline"就能夠了。 */ // .addPipeline(new JsonFilePipeline("E:\\webmagic\\")) .addUrl("https://gitee.com/panmingshuai") .thread(5) // .run() ; /** * 添加監聽器,運行後cmd,使用jconsole.exe調出監聽器 */ SpiderMonitor.instance().register(osSpider); osSpider.start(); } }
解釋一下代碼ide
page.getUrl().regex("https://gitee\\.com/(\\w+)/.*").toString()
和工具
page.getHtml().xpath("//span[@class='project-title']/a[@class='repository']/@href")
這兩段代碼上面一個使用了正則方式匹配內容,下面一個使用了xpath匹配內容,正則就很少說了,xpath的教程能夠看看這個:http://www.w3school.com.cn/xpath/xpath_syntax.asppost
上面的正則匹配的是以https://gitee.com打頭,中間跟了任意個數字,末尾以"."加任意的內容結尾的url,正則匹配能夠用來匹配url之類的鏈接,很是好用。測試
下面的xpath匹配的是全部屬性class爲projiect-title的span元素下屬性class爲repository的a標籤的href的值。xpath匹配網頁上的具體內容,好比名字,文章之類的頗有效。網站
此外還有css選擇器之類的可是我以爲仍是這兩個選擇器好用,並且有了這兩個選擇器,基本上能完成爬蟲全部須要的功能了。
另外這個爬蟲的功能是爬取碼雲上項目的項目名,做者和項目介紹readme。