1. 程式人生 > >java webmagic 抓取靜態網頁資源,抓取動態網頁資源

java webmagic 抓取靜態網頁資源,抓取動態網頁資源

webmagicJava爬蟲框架
fastjson 阿里巴巴提供的 json 轉為物件的快捷包,裡面有下載jar包的地址

抓取靜態網頁資源 。例項:抓取李開復部落格:標題,內容,釋出日期。

public class LiKaiFuBlogReading implements  PageProcessor{
	
	private Site site = Site.me().setRetryTimes(3).setSleepTime(2000);
	private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static final String startPage = "http://blog.sina.com.cn/s/articlelist_1197161814_0_1.html";  // 目錄頁
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Spider.create(new LiKaiFuBlogReading())
		.addPipeline(new JsonFilePipeline("C:\\Users\\Root\\Desktop\\Spider"))  // 寫入到本地的Spider 資料夾裡,如果沒有就會自動生成。
		.addUrl(startPage)
		.thread(10)
		.run();
	}

	@Override
	public Site getSite() {
		return site;
	}

	@Override
	public void process(Page page) {
		String url = page.getRequest().getUrl();
		if(url.startsWith("http://blog.sina.com.cn/s/articlelist_1197161814_0_1.html"))  // 目錄頁開始
		{
			// 提取目錄列表
			List<String> links = page.getHtml().xpath("//span[@class='atc_title']/a/@href").all();
			page.addTargetRequests(links);
			
			//然後提取其他列表頁地址  
			links = page.getHtml().xpath("//ul[@class='SG_pages']/li/a/@href").all();
			page.addTargetRequests(links);
			
			page.setSkip(true);
			
		}else if(url.startsWith("http://blog.sina.com.cn/s")){
			//內容頁
			// 獲取 第一篇 李開復:母親的十件禮物|悼文 內容 文章標題
			// 標題
			String title = page.getHtml().xpath("//h1[@class='h1_tit']/text()").get();
			// 內容
			String content = page.getHtml().xpath("//div[@class='BNE_cont']/allText()").get();
			// 時間
			String timeAndSource = page.getHtml().xpath("//span[@class='time SG_txtc']/text()").get();
			
			
//			// 閱讀數
//			String readingAmount = page.getHtml().xpath("//div[@class='BNE_txtA OL']/span[1]/text()").get();
//			//評論數
//			String comment = page.getHtml().xpath("//div[@class='BNE_txtA OL']/span[2]/text()").get();
			
			
			if(title==null && content == null ) // 說明不是第一篇 李開復:母親的十件禮物|悼文 ,需要重新 get 內容
			{
				title = page.getHtml().xpath("//div[@class='articalTitle']/h2/text()").get();
				content = page.getHtml().xpath("//div[@id='sina_keyword_ad_area2']/allText()").get();
				// 抓取樣式 : ((2018-01-26 18:24:31)
				timeAndSource = page.getHtml().regex("\\d{4}-\\d{2}-\\d{2}\\s\\d+.\\d+.\\d+").toString();

				
			}// 最終保證   不為空  
			page.putField("CONTENT",content);               //置入 文章內容
			page.putField("TITLE",title);                   // 置入文章標題
			page.putField("URL", url);                      // 存入 url
			try {
				long pubtime = format.parse(timeAndSource).getTime();
				page.putField("PUBTIME", pubtime);
			} catch (ParseException e) {
				e.printStackTrace();
			}
			page.putField("PUBTIME",timeAndSource);     // 置入文章標題
		}
	}
}

抓取動態網頁資源。 需要 fastjson.jar 包。示例,抓取京東手機頁:手機名稱,價格(是動態抓取的),詳情頁連線,產品 ID。

public class JingDongMobilePhone implements PageProcessor {

	private Site site = Site.me().setRetryTimes(3).setSleepTime(2000);
	private static AddJDMoblieInfo addJDMoblieInfo;
//	private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	//public static final String startPage = "http://list.jd.com/list.html?cat=9987,653,655";    // 京東起始頁
	public static final String startPage = "http://list.jd.com/list.html?cat=9987,653,655";    // 京東起始頁 http://item.jd.com/5089273.html

	public static void main(String args[]) {
		addJDMoblieInfo = new AddJDMoblieInfo();
		Spider spider = Spider.create(new JingDongMobilePhone());
		spider.addPipeline(new JsonFilePipeline("C:\\Users\\User\\Desktop\\Spider"));
		spider.addUrl(startPage);
		spider.thread(100);
		spider.run();
	}
	
	
	@Override
	public Site getSite() {
		// TODO Auto-generated method stub
		return site;
	}

	@Override
	public void process(Page page) {
		String url = page.getRequest().getUrl();
//		System.out.println("請求的url是:"+url);
		if(url.startsWith("http://list.jd.com/list.html?cat=9987,653,655")) {    // 手機列表頁
			// 獲取手機的所有連結
			List<String> links = page.getHtml().xpath("//div[@class='p-img']/a/@href").all();
			page.addTargetRequests(links);
			// 獲取其他列表的資訊   下一頁的資訊
			String nextLink =  page.getHtml().xpath("//a[@class='pn-next']/@href").get();
			nextLink = "http://list.jd.com"+nextLink;
			page.addTargetRequest(nextLink);   //
			
			page.setSkip(true);
		}else if(url.startsWith("http://item.jd.com/")){  // 手機詳情頁 http://item.jd.com/7437780.html
			/**
			 *   手機資訊顯示詳情頁
			 *   1. 產品名稱
			 *   2. 產品價格
			 */
			
			page.putField("shoujiUrl", url);
			// 產品 id想·
			String skuId = url.replace("http://item.jd.com/", "").replace(".html", "");
			page.putField("SKUID", skuId);
//			//產品名稱
			String name = page.getHtml().xpath("//div[@class='sku-name']/text()").get();
			page.putField("NAME", name);
			String ajaxLink ="http://p.3.cn/prices/mgets?skuIds=J_"+skuId+"";   // 此連結是通過 查詢頁面的請求連線,最後拼接出來的請求,目前來說這種拼接還是需要人工來拼接
			page.putField("priceUrl", ajaxLink);
//			try {
//				addJDMoblieInfo.insertMobileUrlNameSkuId(url, name, skuId);
//			} catch (SQLException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
			page.addTargetRequest(ajaxLink);
		}else if(url.startsWith("http://p.3.cn/prices/mgets?")){
			
			String skuId = url.replace("http://p.3.cn/prices/mgets?skuIds=J_", "");
			page.putField("SkuId", skuId);
			
			String json = page.getRawText();
			JSONArray jsonArray = JSONArray.parseArray(json);
			
			Price price =  jsonArray.getObject(0, Price.class);
			String JDPrice = price.getOp();
			page.putField("JDPrice", JDPrice);
//			try {
//				addJDMoblieInfo.insertMobilePrice(skuId, JDPrice);  // 這些是新增到資料庫的操作
//			} catch (SQLException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}		
		}
	}
}
//  源網頁 http://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=5#J_main
//  接受網頁   http://list.jd.com		/list.html?cat=9987,653,655&page=4&sort=sort_rank_asc&trans=1&JL=6_0_0

Price.java

public class Price {

	private String op;
	private String m;
	private String id;
	private String p;
	public String getOp() {
		return op;
	}
	public void setOp(String op) {
		this.op = op;
	}
	public String getM() {
		return m;
	}
	public void setM(String m) {
		this.m = m;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getP() {
		return p;
	}
	public void setP(String p) {
		this.p = p;
	}
}