1. 程式人生 > >webMagic爬蟲抓取某個部落格全部文章名稱

webMagic爬蟲抓取某個部落格全部文章名稱

demo下載地址:點選開啟連結

主要類:

package testMagic;

import java.util.List;

import javax.management.JMException;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.monitor.SpiderMonitor;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
/**
 * PageProcessor是webmagic-core的一部分,定製一個PageProcessor即可實現自己的爬蟲邏輯。
 * 以下是抓取csdn部落格的一段程式碼
 */
public class OschinaBlogPageProcesser implements PageProcessor {
	private Site site = Site.me().setSleepTime(1);
	public Site getSite() {
		return site;
	}
	int temp=1;
	//process(過程)
	public void process(Page page) {
		//通過page.putField()來儲存抽取結果
		//page.getHtml().xpath()則是按照某個規則對結果進行抽取,這裡抽取支援鏈式呼叫
		List<String> pages=page.getHtml().xpath("[@class='pagelist']").links().all();
		if (pages.size()>5) {
			pages.remove(pages.size()-1);
		}
		page.addTargetRequests(pages);//用於獲取所有滿足"(http://blog\\.csdn\\.net/u012012240/article/month/2016/08/\\d+)"這個正則表示式的連結
		//區分是列表頁面還是資訊頁面
		if (page.getUrl().regex("article/list").match()) {
			List<String> links = page.getHtml().xpath("[@class='link_title']").links().regex("http://blog\\.csdn\\.net/chenyufeng1991/article/details/\\d+").all();
			//通過page.addTargetRequests()方法來增加要抓取的URL
			page.addTargetRequests(links);	
		}else {
			System.out.println("記錄數:"+temp++);
			page.putField("title", page.getHtml().xpath("//[@class='link_title']/a/text()").toString());
		}
	}

	//執行這個main方法,即可在控制檯看到抓取結果。webmagic預設有3秒抓取間隔,請耐心等待。
	public static void main(String[] args) {
		//Spider是爬蟲的入口類,addurl為入口url
		Spider oschinaSpider = Spider.create(new OschinaBlogPageProcesser()).addUrl("http://blog.csdn.net/CHENYUFENG1991/article/list/1")
				//Pipeline是結果輸出和持久化的介面,這裡ConsolePipeline表示結果輸出到控制檯
				.addPipeline(new ConsolePipeline());
		try {
			//新增到JMT監控中
			SpiderMonitor.instance().register(oschinaSpider);
			//設定執行緒數
			//oschinaSpider.thread(5);
			oschinaSpider.run();
		} catch (JMException e) {
			e.printStackTrace();
		} 
	}
}