使用crawler4j非常简单,源码中已经包涵了很多的例子,并且是直接就可以运行的。
首先运行pom.xml,或者是直接下载依赖库:
https://code.google.com/p/crawler4j/downloads/detail?name=crawler4j-3.5-dependencies.zip&can=2&q=
打开edu.uci.ics.crawler4j.examples.basic下的BasicCrawlController,就一个main方法,注释掉前3行,改下目录和线程数:
/*if (args.length != 2) { System.out.println("Needed parameters: "); System.out.println("\t rootFolder (it will contain intermediate crawl data)"); System.out.println("\t numberOfCralwers (number of concurrent threads)"); return; }*/ /* * 爬取时数据临时存放目录. */ String crawlStorageFolder = "./tmp"; /* * 爬取线程数,即同时有多少个爬虫工作. */ int numberOfCrawlers = 5;
保存,运行,程序就开始输出爬取出来的信息了。看,多简单!
翻到BasicCrawlController最后,修改入口URL:
/* * 添加入口URL */ controller.addSeed("http://www.ics.uci.edu/"); controller.addSeed("http://www.ics.uci.edu/~lopes/"); controller.addSeed("http://www.ics.uci.edu/~welling/"); /* * 开始工作 */ controller.start(BasicCrawler.class, numberOfCrawlers);
打开BasicCrawler,修改visit方法:
public void visit(Page page) { int docid = page.getWebURL().getDocid(); //这是程序定义的ID String url = page.getWebURL().getURL(); //URL地址 String domain = page.getWebURL().getDomain(); //域名,如baidu.com String path = page.getWebURL().getPath(); //路径,不包含URL参数 String subDomain = page.getWebURL().getSubDomain(); //子域名,如www, String parentUrl = page.getWebURL().getParentUrl(); //父页面,即从哪个页面发现的该URL的 String anchor = page.getWebURL().getAnchor(); //锚,即HTML显示的信息,如<a href="***">锚</a> System.out.println("Docid: " + docid); System.out.println("URL: " + url); System.out.println("Domain: '" + domain + "'"); System.out.println("Sub-domain: '" + subDomain + "'"); System.out.println("Path: '" + path + "'"); System.out.println("Parent page: " + parentUrl); System.out.println("Anchor text: " + anchor); if (page.getParseData() instanceof HtmlParseData) { HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); String text = htmlParseData.getText(); //HTML显示的信息 String html = htmlParseData.getHtml(); //HTML全部代码 List<WebURL> links = htmlParseData.getOutgoingUrls(); //在该页面发现的全部URL地址 System.out.println("Text length: " + text.length()); System.out.println("Html length: " + html.length()); System.out.println("Number of outgoing links: " + links.size()); } Header[] responseHeaders = page.getFetchResponseHeaders(); //页面服务器返回的HTML头信息 if (responseHeaders != null) { System.out.println("Response headers:"); for (Header header : responseHeaders) { System.out.println("\t" + header.getName() + ": " + header.getValue()); } } System.out.println("============="); }
很简单,直接修改BasicCrawler的shouldVisit方法:
private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|bmp|gif|jpe?g" + "|png|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.startsWith("http://www.ics.uci.edu/"); }
回到BasicCrawlController,找到下面两行代码,修改就可以了:
/* * 深度,即从入口URL开始算,URL是第几层。如入口A是1,从A中找到了B,B中又有C,则B是2,C是3 */ config.setMaxDepthOfCrawling(2); /* * 最多爬取多少个页面 */ config.setMaxPagesToFetch(1000);
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。