Java开源爬虫框架crawler4j
花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以决定翻译一下。六级540多分的水平,大家见谅 。每句话都有根据自己的理解来翻译。特别是快速开始那一部分的源代码。这里是:
github项目地址
crawler4j
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
Java开源爬虫框架crawler4j的更多相关文章
- JAVA开源爬虫列表及简介
本文列举了一些较为常用的JAVA开源爬虫框架: 1.Apache Nutch 官方网站:http://nutch.apache.org/ 是否支持分布式:是 可扩展性:中.Apache Nutch并不 ...
- 通过源码分析Java开源任务调度框架Quartz的主要流程
通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...
- 基于Java的开源爬虫框架WebCollector的使用
一.WebCollector介绍 WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. WebCollecto ...
- java 开源缓存框架--转载
原文地址:http://www.open-open.com/13.htm JBossCache/TreeCache JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的 ...
- [原创]一款小巧、灵活的Java多线程爬虫框架(AiPa)
1.简介 AiPa 是一款小巧,灵活,扩展性高的多线程爬虫框架. AiPa 依赖当下最简单的HTML解析器Jsoup. AiPa 只需要使用者提供网址集合,即可在多线程下自动爬取,并对一些异常进行处理 ...
- [原创]一款基于Reactor线程模型的java网络爬虫框架
AJSprider 概述 AJSprider是笔者基于Reactor线程模式+Jsoup+HttpClient封装的一款轻量级java多线程网络爬虫框架,简单上手,小白也能玩爬虫, 使用本框架,只需要 ...
- Java开源安全框架之Apache Shiro
APACHE SHIRO安全框架 1 背景 Shiro项目始于2003年初,当时它叫JSecurity项目,当时对于Java应用开发人员没有太多的安全替代方案,始终被一个叫JAAS(Java ...
- java开源安全框架-------Apache Shiro--第一天
1.1.简介 Apache Shiro 是Java的一个安全框架.目前使用Apache Shiro 的人越来越多,因为它相当简单,对比Spring Security,可能没有没有Spring Secu ...
- Ehcache Java开源缓存框架
一.ehcache.xml 配置详解 单机配置: <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
随机推荐
- c++读取文件夹及子文件夹数据
这里有两种情况:读取文件夹下所有嵌套的子文件夹里的所有文件 和 读取文件夹下的指定子文件夹(或所有子文件夹里指定的文件名) <ps,里面和file文件有关的结构体类型和方法在 <io.h ...
- Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)
一.学习ArrayList与Map时,关于常用遍历方法的记录如下: 二.附源码如下: package com.study.in.myself; import java.util.ArrayList; ...
- [剑指Offer] 52.正则表达式匹配
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- [计算机网络-应用层] FTP协议
文件传输协议:FTP 如下图所示:用户通过一个FTP用户代理与FTP交互.该用户首先提供远程主机的主机名,使本地主机的FTP客户机进程建立一个到远程主机FTP服务器进程的TCP连接.然后,该用户提供用 ...
- 【Asp.Net】IIS应用程序池添加ASP.NET v4.0
可能在安装.NET Framewrok 4.0之前,IIS就已经装好了,结果在IIS的应用程序池中只有.NET 2.0的Classic .NET AppPool和DefaultAppPool.在使用v ...
- BZOJ 1070 修车(费用流)
如果能想到费用流,这道题就是显然了. 要求所有人的等待平均时间最小,也就是所有人的总等待时间最小. 每辆车只需要修一次,所以s连每辆车容量为1,费用为0的边. 现在需要把每个人拆成n个点,把车和每个人 ...
- csrf漏洞攻击手段和影响详解
针对web应用安全中csrf漏洞两种典型的攻击方式:即输入和执行,这种简单模式下的攻击手段以及中途包含确认页面的攻击方法. 图解什么是csrf漏洞 我们先进行约束,比如存在csrf漏洞的网站叫webA ...
- [bzoj3712][PA2014]Fiolki
description 题面 data range \[ 0\le m<n\le 200000,0\le k\le 500000\] solution 之前本人一直煞笔地思考暴力是否可行 考虑按 ...
- [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡
题目大意:给你一棵$n$个点的树,最多有$20$个叶子节点,问共有几个不同的子串 题解:广义$SAM$,对每个叶子节点深搜一次,每个节点的$lst$设为这个节点当时的父亲,这样就可以时建出来的$SAM ...
- BZOJ1009:[HNOI2008]GT考试——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1009 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0&l ...