阅读对象:有一定全文检索(最好会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代码如下:
<a class="image_gall" title="制作蔬菜沙拉的厨房美女图片" href="http://pic2.sc.chinaz.com/files/pic/pic9/201309/apic880.jpg">
<img border="0" alt="" src="http://pic1.sc.chinaz.com/files/pic/pic9/201309/apic880.jpg"><p></p>
</a>
第二个,
<a class="image_gall" title="中秋吊牌图片" href="http://pic.sc.chinaz.com/files/pic/pic9/201309/apic884.jpg">
<img border="0" src="http://pic2.sc.chinaz.com/files/pic/pic9/201309/apic884.jpg" alt=""><p></p>
</a>
我们要抓取的信息,就在这里面。
比较两次获取的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;
}
}