crawler4j爬虫--爬取技巧总结(鄙人之见)

阅读对象:有一定全文检索(最好会lucene)的理论和实践基础的同学。

对全文检索不是太了解的请参考我前几篇博客

http://blog.csdn.net/bolg_hero/article/category/1631233

首先,我想爬取图片,让自己的搜索 可以爬取图片,首先找一个图片网站我选取的一个网站是http://sc.chinaz.com/ 。为什么不选取百度图片或者相约久久,因为这两个网站的html太复杂了。因此选择这个网站进行全站爬取。

环境:firefox(firebug插件)+eclipse jee+crawler4j3.5+lucene4.4。

本文重点是,如何抓取图片,首先打开http://sc.chinaz.com/,分析url,可知,这个网站url比较有规律(图片类别和url路径有关系),适合爬虫爬取。

抓取思路分析:

首先,用firefox打开:http://sc.chinaz.com/tupian/130915089370.htm

再次,用firefox打开:http://sc.chinaz.com/tupian/130915227724.htm

用firebug,查看网页dom,发现图片所在的html-tag代码如下:


              

第二个,


               

我们要抓取的信息,就在这里面。

比较两次获取的html-tag信息,图片的名字(下面文章同意称呼为图片索引)为class="image_gall"的超链接的title属性的值。

图片的url为class="image_gall"的超链接的要第一个child的src属性的值。

由此可以定义以下爬取规则,初始化爬取uri为http://sc.chinaz.com/tupian/,爬虫设置可以参考如下代码:

package cn.crawler.demo;

import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cn.crawler.lucene.CreateIndexs;
import cn.crawler.lucene.bean.ImageBean;
import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.HtmlParseData;
import edu.uci.ics.crawler4j.url.WebURL;

public class ImageCrawler extends WebCrawler {
	static Log log = LogFactory.getLog("log4j");
	private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|"
			+ "|tiff?|mid|mp2|mp3|mp4" + "|wav|avi|mov|mpeg|ram|m4v|pdf"
			+ "|rm|smil|wmv|swf|wma|zip|rar|gz))$");

	@Override
	public boolean shouldVisit(WebURL url) {
		String href = url.getURL().toLowerCase();
		return !FILTERS.matcher(href).matches()	&& (href.contains("sc.chinaz.com"));
//		return !FILTERS.matcher(href).matches()	&& (href.startsWith("http://sc.chinaz.com/tupian/"));
	}

	@Override
	public void visit(Page page) {
		String url = page.getWebURL().getURL();
		log.info("URL: " + url);
		if (page.getParseData() instanceof HtmlParseData) {
			HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
			String html = htmlParseData.getHtml();
			ImageBean iBean = ImageBean.toImageBean(html);
			if(iBean==null) return;
			log.info(iBean.toString());
			CreateIndexs.saveImage(iBean);
		}
	}
}

html解析可以参考如下代码:

public static ImageBean toImageBean(String html){
		String css_class="image_gall";
		try {	 
			Parser parser = new Parser(html);
			 NodeFilter filter=new CssSelectorNodeFilter("."+css_class);
			 NodeList nList=parser.extractAllNodesThatMatch(filter);
			 if(nList==null||nList.size()<=1) return null;
			 LinkTag node_a=(LinkTag) nList.elementAt(1);
			 ImageTag node_img=(ImageTag) node_a.getFirstChild();
			 ImageBean bBean=new ImageBean();
			 bBean.setTitle(node_a.getAttribute("title"));
			 bBean.setUrl(node_img.getAttribute("src"));
			 if(bBean.isNull()) bBean=null;
			 return bBean;
		} catch (ParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}



 

你可能感兴趣的:(lucene&爬虫)