zoukankan      html  css  js  c++  java
  • Java开源爬虫框架crawler4j

     花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以决定翻译一下。六级540多分的水平,大家见谅 。每句话都有根据自己的理解来翻译。特别是快速开始那一部分的源代码。这里是:
    github项目地址

    crawler4j

    Build Status
    Maven Central
    Gitter Chat

    crawler4j是一个开源的Java抓取Web爬虫,它提供了一个简单的抓取Web的界面。 使用它,你可以在几分钟内设置一个多线程的网络爬虫。

    内容列表

    • 下载安装
    • 快速开始
    • 使用工厂
    • 更多实例
    • 配置详情
    • License

    下载安装

    使用Maven

    要使用最新版本的crawler4j,请在您的pom.xml中使用以下代码片段

        <dependency>
            <groupId>edu.uci.ics</groupId>
            <artifactId>crawler4j</artifactId>
            <version>4.3</version>
        </dependency>

    快照

    您可以添加以下内容以使用下一个快照发行版

        <repositories>
            <repository>
                <id>onebeartoe</id>
                <name>onebeartoe</name>
                <url>https://repository-onebeartoe.forge.cloudbees.com/snapshot/</url>
            </repository>
        </repositories>
    
        <dependencies>
            <dependency>
                <groupId>edu.uci.ics</groupId>
                <artifactId>crawler4j</artifactId>
                <version>4.4-SNAPSHOT</version>
            </dependency>
        </dependencies>

    如果没有Maven

    从4.3版本开始如果你需要一个包含所有依赖的东西的jar包。你需要自己去构建它。克隆repo并且运行

        $ mvn package -Pfatjar

    你会发现在 target/ 文件夹有一个叫做 crawler4j-X.Y-with-dependencies.jar.

    使用Gradle

    请在build.gradle文件中包含以下依赖项以使用crawler4j

    compile group: 'edu.uci.ics', name: 'crawler4j', version: '4.3'
    

    此外,在build.gradle中添加以下存储库url,以获得依赖关系[sleepycat](https://mvnrepository.com/artifact/com.sleepycat/je/5.0.84

        maven {
                url "https://repo.boundlessgeo.com/main/"
            }
    

    快速开始

    您需要创建一个扩展WebCrawler的爬虫类。 该类决定应该抓取哪些URL并处理下载的页面。 以下是一个示例实现:

    public class MyCrawler extends WebCrawler {
        /**
         * 正则表达式匹配指定的后缀文件
         */
        private final static Pattern FILTERS = Pattern.compile(".*(\.(css|js|gif|jpg" + "|png|mp3|mp4|zip|gz))$");
    
        /**
         * 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url
         * 第一个参数referringPage封装了当前爬取的页面信息 第二个参数url封装了当前爬取的页面url信息
         * 在这个例子中,我们指定爬虫忽略具有css,js,git,...扩展名的url,只接受以“http://www.ics.uci.edu/”开头的url。
         * 在这种情况下,我们不需要referringPage参数来做出决定。
         */
        @Override
        public boolean shouldVisit(Page referringPage, WebURL url) {
            String href = url.getURL().toLowerCase();// 得到小写的url
            return !FILTERS.matcher(href).matches() // 正则匹配,过滤掉我们不需要的后缀文件
                    && href.startsWith("http://www.ics.uci.edu/");// 只接受以“http://www.ics.uci.edu/”开头的url
        }
    
        /**
         * 当一个页面被提取并准备好被你的程序处理时,这个函数被调用。
         */
        @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());
            }
        }
    }

    从上面的代码可以看出,有两个主要的方法应该被覆盖

    • shouldVisit: 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url第一个参数referringPage封装了当前爬取的页面信息 第二个参数url封装了当前爬取的页面url信息
    • visit: 该功能在URL内容下载成功后调用。
      您可以轻松获取下载页面的网址,文本,链接,html和唯一ID。

    您还应该实现一个控制器类,指定抓取的种子,抓取数据应该存储在哪个文件夹以及并发线程的数量:

    public class Controller {
        public static void main(String[] args) throws Exception {
            String crawlStorageFolder = "E:/crawler";// 定义爬虫数据存储位置
            int numberOfCrawlers = 7;// 定义了7个爬虫,也就是7个线程
    
            CrawlConfig config = new CrawlConfig();// 定义爬虫配置
            config.setCrawlStorageFolder(crawlStorageFolder);// 设置爬虫文件存储位置
    
            /*
             * 实例化爬虫控制器。
             */
            PageFetcher pageFetcher = new PageFetcher(config);// 实例化页面获取器
            RobotstxtConfig robotstxtConfig = new RobotstxtConfig();// 实例化爬虫机器人配置
            // 实例化爬虫机器人对目标服务器的配置,每个网站都有一个robots.txt文件
            // 规定了该网站哪些页面可以爬,哪些页面禁止爬,该类是对robots.txt规范的实现
            RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
            // 实例化爬虫控制器
            CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
    
            /*
             * 对于每次抓取,您需要添加一些种子网址。 这些是抓取的第一个URL,然后抓取工具开始跟随这些页面中的链接
             */
            controller.addSeed("http://www.ics.uci.edu/~lopes/");
            controller.addSeed("http://www.ics.uci.edu/~welling/");
            controller.addSeed("http://www.ics.uci.edu/");
    
            /**
             * 启动爬虫,爬虫从此刻开始执行爬虫任务,根据以上配置
             */
            controller.start(MyCrawler.class, numberOfCrawlers);
        }
    }

    结果(eclipse+Marven测试):

    使用工厂

    使用工厂可以方便地将crawler4j集成到IoC环境中(如Spring,Guice)或者将信息或协作者传递给每个“WebCrawler”实例。

    public class CsiCrawlerCrawlerControllerFactory implements CrawlController.WebCrawlerFactory {
    
        Map<String, String> metadata;
        SqlRepository repository;
    
        public CsiCrawlerCrawlerControllerFactory(Map<String, String> metadata, SqlRepository repository) {
            this.metadata = metadata;
            this.repository = repository;
        }
    
        @Override
        public WebCrawler newInstance() {
            return new MyCrawler(metadata, repository);
        }
    }

    要使用工厂只需要调用CrawlController中的正确方法(如果你在Spring或Guice中,可能会想使用startNonBlocking):

                MyCrawlerFactory factory = new MyCrawlerFactory(metadata, repository);
                controller.startNonBlocking(factory, numberOfCrawlers);

    更多例子

    • Basic crawler: 上面的例子的完整的源代码更多的细节。
    • Image crawler: 一个简单的图像爬虫,从爬取网站下载图像内容,并将其存储在一个文件夹中。本示例演示如何使用crawler4j获取二进制内容。
    • Collecting data from threads:此示例演示了控制器如何从爬取线程收集数据/统计信息。
    • Multiple crawlers:这是一个示例,显示了两个不同的抓取工具如何同时运行。 例如,您可能希望将抓取划分到不同的域中,然后为每个组采用不同的抓取策略。 每个抓取控制器可以有自己的配置。
    • Shutdown crawling:
      这个例子显示通过向控制器发送’shutdown’命令可以正常终止爬行。
    • Postgres/JDBC integration: 这个实例展示了了如何将抓取的内容保存到Postgres数据库(或任何其他JDBC存储库)中。

    配置详情

    控制器类具有类型为CrawlConfig的必需参数
    这个类的实例可以用来配置crawler4j。以下部分描述配置的一些细节。

    爬取深度

    默认情况下,爬取深度没有限制。 但是你可以限制爬取的深度。 例如,假设你有一个种子页面“A”,链接到“B”,链接到“C”,链接到“D”。 所以,我们有以下链接结构:
    A -> B -> C -> D

    因为“A”是一个种子页面,它的深度为0.“B”的深度为1,依此类推。 您可以设置crawler4j抓取的网页的深度限制。 例如,如果将此限制设置为2,则不会抓取页面“D”。 要设置您可以使用的最大深度:

    crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling);

    启用SSL

    简单地启用SSL:

    CrawlConfig config = new CrawlConfig();
    
    config.setIncludeHttpsPages(true);

    要抓取的最大页数

    虽然默认情况下,要抓取的页面数量没有限制,但您可以对此设置一个限制:

    crawlConfig.setMaxPagesToFetch(maxPagesToFetch);

    启用二进制内容爬取

    默认情况下,抓取二进制内容(即图像,音频等)被关闭。要启用才能抓取这些文件:

    crawlConfig.setIncludeBinaryContentInCrawling(true);

    看一个例子 here 来获取更多细节。

    文明性问题(礼貌的爬取)

    crawler4j的设计非常高效,能够非常快地抓取域名
    (例如,它已经能够每秒抓取200个维基百科页面)。 不过现在是反对爬取网站的,因为这样在服务器上给他们承受巨大的负载(他们可能会阻止你!),
    从版本1.3开始,默认情况下,crawler4j会在请求之间等待至少200毫秒。
    不过,这个参数可以调整:

    crawlConfig.setPolitenessDelay(politenessDelay);

    代理

    你的爬取应该在代理之后运行吗? 如果是这样,你可以使用:

    crawlConfig.setProxyHost("proxyserver.example.com");
    crawlConfig.setProxyPort(8080);

    如果你的代理也需要认证:

    crawlConfig.setProxyUsername(username);
    crawlConfig.setProxyPassword(password);

    可恢复的爬取

    有时您需要长时间运行爬虫。 搜索器可能意外终止。 在这种情况下,可能需要恢复抓取。您可以使用以下设置恢复以前停止/崩溃的抓取:

    crawlConfig.setResumableCrawling(true);

    但是,您应该注意,它可能会使爬行速度稍慢。

    User agent string

    用户代理字符串用于将您的搜寻器表示为Web服务器。
    查看 here获取更过详细内容.默认情况下,crawler4j使用以下用户代理字符串:

    "crawler4j (https://github.com/yasserg/crawler4j/)"

    但是,您可以覆盖它:

    crawlConfig.setUserAgentString(userAgentString);

    License

    Copyright (c) 2010-2017 Yasser Ganjisaffar

    Published under Apache License 2.0, see LICENSE

  • 相关阅读:
    [React]核心概念
    [算法]复杂度分析
    [算法]移除指定元素&strSr()的实现
    [算法]合并链表&删除数组重复项
    php _weakup()反序列化漏洞
    Java 注解详解
    MyBatis入门
    Spring 事务管理
    Spring AOP
    Spring JDBC
  • 原文地址:https://www.cnblogs.com/snailclimb/p/9086461.html
Copyright © 2011-2022 走看看