Crawler4j 快速入门


crawler4j是Java实现的开源网络爬虫。提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫

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

创建一个maven项目。在pom.xml贴上所需jar

    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.8.2</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>edu.uci.ics</groupId>
      <artifactId>crawler4j</artifactId>
      <version>4.2</version>
    </dependency>

在resources下贴上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 ]

编写爬虫类

package com.gcx.crawler;

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;

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

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

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


    /**
     *   根据url进行网页的解析,对返回为TRUE的网页进行抓取
     *   第一个参数referringPage封装了当前爬取的页面信息
     *   第二个参数封装了当前爬取页面的url信息
     */
    @Override
    public boolean shouldVisit(Page referringPage, WebURL url) {
        //小写url
        String href=url.getURL().toLowerCase();
        //正则匹配,过滤掉我们不需要的后缀文件
        return !FILTERS.matcher(href).matches()//匹配过滤掉不需要的后缀文件
                && href.startsWith("http://www.bjsxt.com");//url必须是http://www.baidu.com开头
    }

    /**
     * 解析网页内容,page类包含了丰富的方法,可以利用这些方法得到网页的内容和属性
     * 当我们爬取到我们需要的页面,这个方法会被调用,我们可以随意处理页面
     * page 封装了所有页面信息
     *
     */
    @Override
    public void visit(Page page) {
        //获取url
        String url=page.getWebURL().getURL();
        System.out.println("url:"+url);
        //判断是否是html数据
        if(page.getParseData() instanceof HtmlParseData){
            //强制类型转换,获取html数据对象
            HtmlParseData htmlParseData= (HtmlParseData) page.getParseData();
            //获得页面纯文本
            String text=htmlParseData.getText();
            //获得页面html
            String html=htmlParseData.getHtml();
            //获取页面输出链接
            Set<WebURL> links=htmlParseData.getOutgoingUrls();

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



一个控制器调用,我们爬取一个www.bjsxt.com

package com.gcx.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;

/**
 * 爬虫控制器
 */
public class Controller {
    public static void main(String[] args) throws Exception {
        //定义爬虫存储的位置
        String crawStorageFoler="d:/crawler";
        //定义爬虫线程7个
        int numberOfCrawlers=1;
        //定义爬虫配置
        CrawlConfig config=new CrawlConfig();
        //设置爬虫文件存储位置
        config.setCrawlStorageFolder(crawStorageFoler);
        //实例化页面获取器
        PageFetcher pageFetcher=new PageFetcher(config);
        //实例化爬虫机器人配置,比如可以设置user-agent
        RobotstxtConfig robotstxtconfig=new RobotstxtConfig();
        //实例化爬虫机器人对目标服务器的配置,每个网站都有一个robots.txt文件
        //规定了该网站哪些页面可以爬,哪些页面禁止爬,该类是对robots.txt规范的实现
        RobotstxtServer robotstxtServer=new RobotstxtServer(robotstxtconfig,pageFetcher);
        //实例化爬虫控制器
        CrawlController controller=new CrawlController(config,pageFetcher,robotstxtServer);
        //配置爬取种子页面,就是规定从哪里开始爬,可以配置多个种子页面
        controller.addSeed("http://www.bjsxt.com");


        //启动爬虫,爬虫从此刻开始执行爬虫任务
        controller.start(MyCrawler.class,numberOfCrawlers);
    }
}

爬取如下:

简单一个爬虫实例搞定


当然还提供了基本的实例

package com.gcx.crawler;

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;
import org.apache.http.Header;

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

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

    /**
     * 正则匹配指定的后缀文件  指定图片后缀
     */
    private static final Pattern IMAGE_EXTENSIONS = Pattern.compile(".*\\.(bmp|gif|jpg|png)$");

    /**
     * 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url
     * 第一个参数referringPage封装了当前爬取的页面信息
     * 第二个参数url封装了当前爬取的页面url信息
     */
    @Override
    public boolean shouldVisit(Page referringPage, WebURL url) {
        String href = url.getURL().toLowerCase(); // 得到小写的url
        // 过滤掉含有图片后缀的url
        if (IMAGE_EXTENSIONS.matcher(href).matches()) {
            return false;
        }

        // 只接受www.bjsxt.com开头的url
        return href.startsWith("http://www.bjsxt.com/");
    }

    /**
     * 当我们爬到我们需要的页面,这个方法会被调用,我们可以尽情的处理这个页面
     * page参数封装了所有页面信息
     */
    @Override
    public void visit(Page page) {
        int docid = page.getWebURL().getDocid(); // 获取docid url的唯一识别 类似主键
        String url = page.getWebURL().getURL();  // 获取url
        String domain = page.getWebURL().getDomain(); // 获取域名
        String path = page.getWebURL().getPath();  // 获取路径
        String subDomain = page.getWebURL().getSubDomain(); // 获取子域名
        String parentUrl = page.getWebURL().getParentUrl(); // 获取上级Url
        String anchor = page.getWebURL().getAnchor(); // 获取锚点

        System.out.println("docid:" + docid);
        System.out.println("url:" + url);
        System.out.println("domain:" + domain);
        System.out.println("path:" + path);
        System.out.println("subDomain:" + subDomain);
        System.out.println("parentUrl:" + parentUrl);
        System.out.println("anchor:" + anchor);


        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());
        }

        Header[] responseHeaders = page.getFetchResponseHeaders(); // 获取响应头消息
        if (responseHeaders != null) {
            System.out.println("响应的头消息");
            for (Header header : responseHeaders) {
                System.out.println(header.getName() + "+" + header.getValue());
            }
        }

    }
}



package com.gcx.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;

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

        CrawlConfig config = new CrawlConfig();  // 实例化爬虫配置文件

        config.setCrawlStorageFolder(crawlStorageFolder); // 设置爬虫文件存储位置

        /*
         * 设置请求的频率
         * 每1000毫秒,也就是两次请求的间隔至少是1秒
         */
        config.setPolitenessDelay(1000);

        /*
         * 设置请求的网页的深度(后面专门会讲)  设置2 为两层
         * 默认值-1 无限深度
         */
        config.setMaxDepthOfCrawling(2);

        /*
         * 设置爬取的最大网页数 这里设置1000  最多爬取1000次
         * 默认值是-1,表示无限制
         */
        config.setMaxPagesToFetch(1000);

        /**
         * 是否爬取二进制文件,比如图片,PDF文档,视频之类的东西 这里设置false 不爬取
         * 默认值true,爬取
         */
        config.setIncludeBinaryContentInCrawling(false);

        /*
         * 这里可以设置代理
         * config.setProxyHost("proxyserver.example.com");  // 代理地址
         * config.setProxyPort(8080); // 代理端口
         *
         * 如果使用代理,也可以设置身份认证  用户名和密码
         * config.setProxyUsername(username); config.getProxyPassword(password);
         */

        /*
         * 这个配置假如设置成true,当一个爬虫突然终止或者奔溃,我们可以恢复;
         * 默认配置是false;推荐用默认配置,假如设置成true,性能会大打折扣;
         */
        config.setResumableCrawling(false);

        /*
         * 实例化爬虫控制器
         */
        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.bjsxt.com/");

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

运行如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值