爬蟲學習——webmagic工具學習

    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。

代碼地址:https://gitee.com/panmingshuai/webmagic-demo.git

相關文章
相關標籤/搜索