Crawler4j快速入门实例

本章来源:http://blog.java1234.com/blog/articles/112.html

面我们来写一个Demo,让大家快速入门crawler4j;代码中加了详细的备注,大家可以好好看看。

crawler4j中用了slf4j来记录项目运行日志信息。我们使用slf4j具体实现类log4j;

首先我们在pom.xml中加入log4j以及log4j驱动类支持;

<!-- 加入log4j支持 -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

<!-- 加入slf4j log4j驱动类 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>

log4j.properties配置如下:

log4j.rootLogger = debug,D,E


### debug ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = c://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### error ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =c://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]

然后我们先来定义一个MyCrawler

package com.java1234.crawler;

import java.util.Set;
import java.util.regex.Pattern;

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;

/**
 * 自定义爬虫类需要继承WebCrawler类,决定哪些url可以被爬以及处理爬取的页面信息
 * @author 
 *
 */
public class MyCrawler extends WebCrawler {

    /**
     * 正则匹配指定的后缀文件
     */
    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg"
                                                           + "|png|mp3|mp3|zip|gz))$");

     /**
      * 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url
      * 第一个参数referringPage封装了当前爬取的页面信息
      * 第二个参数url封装了当前爬取的页面url信息
      */
     @Override
     public boolean shouldVisit(Page referringPage, WebURL url) {
         String href = url.getURL().toLowerCase();  // 得到小写的url
         return !FILTERS.matcher(href).matches()   // 正则匹配,过滤掉我们不需要的后缀文件
                && href.startsWith("http://www.java1234.com/");  // url必须是http://www.java1234.com/开头,规定站点
     }

     /**
      * 当我们爬到我们需要的页面,这个方法会被调用,我们可以尽情的处理这个页面
      * page参数封装了所有页面信息
      */
     @Override
     public void visit(Page page) {
         String url = page.getWebURL().getURL();  // 获取url
         System.out.println("URL: " + url);

         if (page.getParseData() instanceof HtmlParseData) {  // 判断是否是html数据
             HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); // 强制类型转换,获取html数据对象
             String text = htmlParseData.getText();  // 获取页面纯文本(无html标签)
             String html = htmlParseData.getHtml();  // 获取页面Html
             Set<WebURL> links = htmlParseData.getOutgoingUrls();  // 获取页面输出链接

             System.out.println("纯文本长度: " + text.length());
             System.out.println("html长度: " + html.length());
             System.out.println("输出链接个数: " + links.size());
         }
    }
}

再写一个控制器Controller:

package com.java1234.crawler;

import edu.uci.ics.crawler4j.crawler.CrawlConfig;
import edu.uci.ics.crawler4j.crawler.CrawlController;
import edu.uci.ics.crawler4j.fetcher.PageFetcher;
import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;
import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;

/**
 * 爬虫控制器
 * @author 
 *
 */
public class Controller {
    public static void main(String[] args) throws Exception {
        String crawlStorageFolder = "c:/crawl"; // 定义爬虫数据存储位置
        int numberOfCrawlers = 7; // 定义7个爬虫,也就是7个线程

        CrawlConfig config = new CrawlConfig(); // 定义爬虫配置
        config.setCrawlStorageFolder(crawlStorageFolder); // 设置爬虫文件存储位置

        /*
         * 实例化爬虫控制器
         */
        PageFetcher pageFetcher = new PageFetcher(config); // 实例化页面获取器
        RobotstxtConfig robotstxtConfig = new RobotstxtConfig(); // 实例化爬虫机器人配置 比如可以设置 user-agent

        // 实例化爬虫机器人对目标服务器的配置,每个网站都有一个robots.txt文件 规定了该网站哪些页面可以爬,哪些页面禁止爬,该类是对robots.txt规范的实现
        RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher); 
        // 实例化爬虫控制器
        CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

        /**
         * 配置爬虫种子页面,就是规定的从哪里开始爬,可以配置多个种子页面
         */
        controller.addSeed("http://www.java1234.com/");
        controller.addSeed("http://www.java1234.com/a/kaiyuan/");
        controller.addSeed("http://www.java1234.com/a/bysj/");

        /**
         * 启动爬虫,爬虫从此刻开始执行爬虫任务,根据以上配置
         */
        controller.start(MyCrawler.class, numberOfCrawlers);
    }
}

我们运行Controller,效果如下:
这里写图片描述

这个是一个很简单的实例,大家可以根据我的注释,以及配合框架源码,好好理解下;

完整代码下载:http://pan.baidu.com/s/1gfpt2lt

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值