博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
crawler4j 爬爬知多少
阅读量:6682 次
发布时间:2019-06-25

本文共 7460 字,大约阅读时间需要 24 分钟。

  1. Crawler是什么?

  crawler4j是一个开源的java爬虫类库,可以用来构建多线程的web爬虫来抓取页面内容。

  2. 如何获取Crawler?

  crawler4j的官方地址在,目前版本为4.1。如果你使用Maven,可以通过下面的pom的方式,如直接下载,。

  3. Crawler怎么用?

  crawler4j的使用分为两个步骤:一是实现一个继承自edu.uci.ics.crawler4j.crawler.WebCrawler的爬虫类;另外就是通过CrawController调用实现的爬虫类。

package com.favccxx.favsoft.favcrawler;import java.util.Set;import java.util.regex.Pattern;import org.slf4j.Logger;import org.slf4j.LoggerFactory;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 FavWebCrawler extends WebCrawler {	private static final Logger logger = LoggerFactory.getLogger(WebCrawler.class);	private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg" + "|png|mp3|mp3|zip|gz))$");	@Override	public boolean shouldVisit(Page referringPage, WebURL url) {		String href = url.getURL().toLowerCase();		return !FILTERS.matcher(href).matches() && href.startsWith("http://www.oschina.net/");	}	/**	 * 处理抓取到的页面时,调用该方法	 	 */	@Override	public void visit(Page page) {		int docid = page.getWebURL().getDocid();		String url = page.getWebURL().getURL();		String domain = page.getWebURL().getDomain();		String path = page.getWebURL().getPath();		String subDomain = page.getWebURL().getSubDomain();		String parentUrl = page.getWebURL().getParentUrl();		String anchor = page.getWebURL().getAnchor();		logger.debug("Docid: {}", docid);		logger.info("URL: {}", url);		logger.debug("Domain: '{}'", domain);		logger.debug("Sub-domain: '{}'", subDomain);		logger.debug("Path: '{}'", path);		logger.debug("Parent page: {}", parentUrl);		logger.debug("Anchor text: {}", anchor);		if (page.getParseData() instanceof HtmlParseData) {			HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();			String text = htmlParseData.getText();			String html = htmlParseData.getHtml();			Set
 links = htmlParseData.getOutgoingUrls(); logger.debug("Text length: " + text.length()); logger.debug("Html length: " + html.length()); logger.debug("Number of outgoing links: " + links.size()); } }}

package com.favccxx.favsoft.favcrawler;import java.util.Set;import java.util.regex.Pattern;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import edu.uci.ics.crawler4j.crawler.CrawlConfig;import edu.uci.ics.crawler4j.crawler.CrawlController;import edu.uci.ics.crawler4j.crawler.Page;import edu.uci.ics.crawler4j.crawler.WebCrawler;import edu.uci.ics.crawler4j.fetcher.PageFetcher;import edu.uci.ics.crawler4j.parser.HtmlParseData;import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;import edu.uci.ics.crawler4j.url.WebURL;public class MyCrawler extends WebCrawler {		private static final Logger logger = LoggerFactory.getLogger(WebCrawler.class);		private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg"  + "|png|mp3|mp3|zip|gz))$");		 @Override     public boolean shouldVisit(Page referringPage, WebURL url) {         String href = url.getURL().toLowerCase();         return !FILTERS.matcher(href).matches()                && href.startsWith("http://www.oschina.net/");     }     /**      * This function is called when a page is fetched and ready      * to be processed by your program.      */     @Override     public void visit(Page page) {    	     	 int docid = page.getWebURL().getDocid(); 	    String url = page.getWebURL().getURL(); 	    String domain = page.getWebURL().getDomain(); 	    String path = page.getWebURL().getPath(); 	    String subDomain = page.getWebURL().getSubDomain(); 	    String parentUrl = page.getWebURL().getParentUrl(); 	    String anchor = page.getWebURL().getAnchor();// 	   page.getWebURL().getTag() 	     	    System.out.println("********************************");// 	    // 	    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); 	    logger.debug("Docid: {}", docid); 	    logger.info("URL: {}", url); 	    logger.debug("Domain: '{}'", domain); 	    logger.debug("Sub-domain: '{}'", subDomain); 	    logger.debug("Path: '{}'", path); 	    logger.debug("Parent page: {}", parentUrl); 	    logger.debug("Anchor text: {}", anchor);    	     	 //         String url = page.getWebURL().getURL();         System.out.println("URL: " + url);         if (page.getParseData() instanceof HtmlParseData) {             HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();             String text = htmlParseData.getText();             String html = htmlParseData.getHtml();             Set
 links = htmlParseData.getOutgoingUrls();                          System.out.println("--------------------------");//             System.out.println(text);             System.out.println("--------------------------");             System.out.println("Text length: " + text.length());             System.out.println("Html length: " + html.length());             System.out.println("Number of outgoing links: " + links.size());         }    }         public static void main(String[] args) throws Exception{      String crawlStorageFolder = "/data/crawl/root";         int numberOfCrawlers = 7;         CrawlConfig config = new CrawlConfig();         config.setCrawlStorageFolder(crawlStorageFolder);         /*          * Instantiate the controller for this crawl.          */         PageFetcher pageFetcher = new PageFetcher(config);         RobotstxtConfig robotstxtConfig = new RobotstxtConfig();         RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);         CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);         /*          * For each crawl, you need to add some seed urls. These are the first          * URLs that are fetched and then the crawler starts following links          * which are found in these pages          */         controller.addSeed("http://www.oschina.net/");//         controller.addSeed("http://www.ics.uci.edu/~welling/");//         controller.addSeed("http://www.ics.uci.edu/");         /*          * Start the crawl. This is a blocking operation, meaning that your code          * will reach the line after this only when crawling is finished.          */         controller.start(MyCrawler.class, numberOfCrawlers);    }}

  4. Crawler常用配置

  crawler4j的配置文件都位于edu.uci.ics.crawler4j.crawler.CrawlConfig中,各配置属性的详细说明如下。

    crawlStorageFolder:临时存储抓取来的文件的地方,相当于文件中转站。

    resumableCrawling:是否重新抓取上一个异常停止/损坏的文件的开关,默认不开启。如果开启该开关,毫无疑问会降低抓取的效率。

    maxDepthOfCrawling:抓取的最大深度。默认为-1,即无限深度。

    maxPagesToFetch:抓取的最大页面数。默认为-1,即无限抓取。

    userAgentString:抓取web服务器的用户代理。默认为“crawler4j (”。


    politenessDelay:(同一主机的两个请求间的)延迟毫秒数。默认为200。


    includeHttpsPages:是否包含Https页面。默认包含。


    includeBinaryContentInCrawling:是否包含二进制文件,如image,audio等。默认为不抓取。


    maxConnectionsPerHost:每个主机的最大连接数,默认为100。


    maxTotalConnections:主机的总共连接数,默认为100。


    socketTimeout:socket超时毫秒数,默认为20000。


    connectionTimeout:连接超时毫秒数,默认为30000。


    maxOutgoingLinksToFollow:每个页面的最大外链数,默认为5000。


    maxDownloadSize:每个页面的最大下载容量,默认1048576kb(1024M),超过的部分不会下载。


    followRedirects:是否抓取重定向的页面,默认抓取。


    proxyHost:代理主机地址,仅在使用代理上网时使用。


    proxyPort:代理端口号。


    proxyUsername:代理用户名。


    proxyPassword:代理密码。


    authInfos:授权用户信息。

   

  

转载地址:http://qkxao.baihongyu.com/

你可能感兴趣的文章
VirtualEnv 和Pip 构建Python的虚拟工作环境
查看>>
NetScaler的部署实验之四更新DDC的SSL证书配置及NetScaler对DDC的负载均衡配置
查看>>
一个会展论坛进行的全息营销“策划” -王甲佳全息营销系列08
查看>>
关于cacti图形显示不正常的解决办法
查看>>
机器学习入门|聚类(一)
查看>>
在cocos2d-x中编译/调试curl库
查看>>
修补AJAX应用中Back/Forward Button和Bookmark失效的问题
查看>>
PowerShell 获取Site Collection下被签出的文件
查看>>
见见面、聊聊天 - 5月22日晚7点Meetup,三里屯绿树旁酒吧,畅谈云技术和应用
查看>>
常用的HTML5、CSS3新特性能力检测写法
查看>>
安卓巴士诚招版主,希望各位巴友踊跃加入我们!
查看>>
【笔记】一些linux实用函数技巧【原创】
查看>>
JS验证集合
查看>>
第05篇:C#星夜拾遗之使用数据库
查看>>
现代软件工程讲义 4 方法论 - MSF
查看>>
线程同步工具类
查看>>
web服务器比较(IIS,Tomcat,Apache,Resin )
查看>>
通过刷bios的方式在win8.1平板上启动windows phone模拟器
查看>>
Linux 串口、usb转串口驱动分析(2-2) 【转】
查看>>
[WPF/Silverlight]让INotifyPropertyChanged的实现更优雅一些
查看>>