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 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 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;
	}
}

你可能感兴趣的:(Java,java,webmagic,抓取静态网页资源,抓取动态网页资源)