Crawler4J:Java网络爬虫框架完整指南

Crawler4J:Java网络爬虫框架完整指南

【免费下载链接】crawler4j Open Source Web Crawler for Java 【免费下载链接】crawler4j 项目地址: https://gitcode.com/gh_mirrors/cr/crawler4j

Crawler4J是一个开源的Java网络爬虫框架,它提供了简单易用的接口来爬取网页内容。使用这个框架,你可以在几分钟内设置一个多线程的网络爬虫。

项目简介

Crawler4J旨在为开发者提供一个简洁的API,帮助他们构建自己的web爬虫程序。它支持多线程爬取,能够处理动态网页和JavaScript,同时提供了灵活的配置选项来满足不同场景的需求。

安装方法

使用Maven

在你的pom.xml文件中添加以下依赖:

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

使用Gradle

在你的build.gradle文件中添加以下依赖:

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

快速开始

你需要创建一个继承WebCrawler的爬虫类。这个类决定哪些URL应该被爬取,并处理下载的页面。以下是一个示例实现:

public class MyCrawler extends WebCrawler {

    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg"
                                                           + "|png|mp3|mp4|zip|gz))$");

    @Override
    public boolean shouldVisit(Page referringPage, WebURL url) {
        String href = url.getURL().toLowerCase();
        return !FILTERS.matcher(href).matches()
               && href.startsWith("https://www.ics.uci.edu/");
    }

    @Override
    public void visit(Page page) {
        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<WebURL> links = htmlParseData.getOutgoingUrls();

            System.out.println("Text length: " + text.length());
            System.out.println("Html length: " + html.length());
            System.out.println("Number of outgoing links: " + links.size());
        }
    }
}

如上面的代码所示,有两个主要函数需要重写:

  • shouldVisit:这个函数决定给定的URL是否应该被爬取。在上面的例子中,我们指示爬虫忽略具有css、js、git等扩展名的URL,并且只接受以"https://www.ics.uci.edu/"开头的URL。

  • visit:这个函数在URL的内容成功下载后被调用。你可以轻松获取下载页面的url、文本、链接、html和唯一标识符。

你还需要实现一个控制器类,指定爬取的种子URL、存储中间爬取数据的文件夹以及并发线程数:

public class Controller {
    public static void main(String[] args) throws Exception {
        String crawlStorageFolder = "/data/crawl/root";
        int numberOfCrawlers = 7;

        CrawlConfig config = new CrawlConfig();
        config.setCrawlStorageFolder(crawlStorageFolder);

        PageFetcher pageFetcher = new PageFetcher(config);
        RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
        RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
        CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

        controller.addSeed("https://www.ics.uci.edu/~lopes/");
        controller.addSeed("https://www.ics.uci.edu/~welling/");
        controller.addSeed("https://www.ics.uci.edu/");
        
        CrawlController.WebCrawlerFactory<BasicCrawler> factory = MyCrawler::new;
        
        controller.start(factory, numberOfCrawlers);
    }
}

更多示例

项目提供了多个实用的示例程序:

  • 基础爬虫:包含完整源代码的详细示例
  • 图片爬虫:一个简单的图片爬虫,从爬取域下载图片内容并存储在文件夹中
  • 线程数据收集:演示控制器如何从爬取线程收集数据/统计信息
  • 多爬虫实例:展示两个不同的爬虫如何并发运行
  • 优雅关闭:演示如何通过向控制器发送"shutdown"命令来优雅地终止爬取
  • Postgres/JDBC集成:展示如何将爬取的内容保存到Postgres数据库

配置详情

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

爬取深度

默认情况下,爬取深度没有限制。但你可以限制爬取深度。例如,假设你有一个种子页面"A",它链接到"B","B"链接到"C","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);

礼貌性设置

crawler4j设计非常高效,能够非常快速地爬取域。然而,由于这违反了爬取策略并给服务器带来巨大负载(它们可能会阻止你!),从版本1.3开始,默认情况下crawler4j在请求之间至少等待200毫秒。但是,这个参数可以调整:

crawlConfig.setPolitenessDelay(politenessDelay);

代理设置

如果你的爬虫需要在代理后面运行,可以使用:

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

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

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

可恢复爬取

有时你需要长时间运行一个爬虫。爬虫可能会意外终止。在这种情况下,可能需要恢复爬取。你可以使用以下设置恢复先前停止/崩溃的爬取:

crawlConfig.setResumableCrawling(true);

但是,你应该注意,这可能会使爬取速度稍慢。

用户代理字符串

用户代理字符串用于向Web服务器表示你的爬虫。默认情况下,crawler4j使用以下用户代理字符串:

"crawler4j"

但是,你可以覆盖它:

crawlConfig.setUserAgentString(userAgentString);

实际应用场景

Crawler4J适用于多种实际应用场景:

  • 数据挖掘:从网站中提取特定的数据或信息
  • 网站监控:定期检查某个网站的更新情况
  • 搜索引擎索引:建立一个小型搜索引擎来索引指定的网站
  • 社交网络分析:收集并分析社交媒体上的数据

项目结构

Crawler4J项目采用清晰的模块化结构:

  • crawler模块:包含核心爬虫逻辑和控制器
  • fetcher模块:负责页面抓取和连接管理
  • parser模块:处理各种格式的内容解析
  • frontier模块:管理URL队列和文档ID
  • robotstxt模块:处理robots.txt协议
  • url模块:提供URL规范化和解析功能

技术特点

  • 轻量级设计:易于安装和使用,不需要依赖任何大型库
  • 易于扩展:提供了许多接口,可以根据需要进行定制和扩展
  • 多线程支持:支持多线程爬取,可以提高爬取速度和效率
  • 异常处理:提供了异常处理机制,能够自动处理各种错误和异常

Crawler4J是一个功能强大且易于使用的网络爬虫框架,无论你是初学者还是经验丰富的开发者,都能快速上手并构建出高效的网络数据采集程序。

【免费下载链接】crawler4j Open Source Web Crawler for Java 【免费下载链接】crawler4j 项目地址: https://gitcode.com/gh_mirrors/cr/crawler4j

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值