花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,由于这几天一直在学习Java爬虫方面的知识,今天上课时忽然感受全英文可能会阻碍不少人学习的动力,恰好本身又正在接触这个爬虫框架,因此决定翻译一下。六级540多分的水平,你们见谅 。每句话都有根据本身的理解来翻译。特别是快速开始那一部分的源代码。这里是: github项目地址css
crawler4j是一个开源的Java抓取Web爬虫,它提供了一个简单的抓取Web的界面。 使用它,你能够在几分钟内设置一个多线程的网络爬虫。html
要使用最新版本的crawler4j,请在您的pom.xml中使用如下代码片断java
<dependency>
<groupId>edu.uci.ics</groupId>
<artifactId>crawler4j</artifactId>
<version>4.3</version>
</dependency>
复制代码
您能够添加如下内容以使用下一个快照发行版git
<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>
复制代码
从4.3版本开始若是你须要一个包含全部依赖的东西的jar包。你须要本身去构建它。克隆repo而且运行github
$ mvn package -Pfatjar
复制代码
你会发如今 target/
文件夹有一个叫作 crawler4j-X.Y-with-dependencies.jar
.正则表达式
请在build.gradle文件中包含如下依赖项以使用crawler4j数据库
compile group: 'edu.uci.ics', name: 'crawler4j', version: '4.3'
复制代码
此外,在build.gradle中添加如下存储库url,以得到依赖关系 sleepycatapache
maven {
url "https://repo.boundlessgeo.com/main/"
}
复制代码
您须要建立一个扩展WebCrawler的爬虫类。 该类决定应该抓取哪些URL并处理下载的页面。 如下是一个示例实现:bash
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());
}
}
}
复制代码
从上面的代码能够看出,有两个主要的方法应该被覆盖服务器
您还应该实现一个控制器类,指定抓取的种子,抓取数据应该存储在哪一个文件夹以及并发线程的数量:
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);
}
}
复制代码
使用工厂能够方便地将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);
复制代码
控制器类具备类型为CrawlConfig的必需参数 这个类的实例能够用来配置crawler4j。如下部分描述配置的一些细节。
默认状况下,爬取深度没有限制。 可是你能够限制爬取的深度。 例如,假设你有一个种子页面“A”,连接到“B”,连接到“C”,连接到“D”。 因此,咱们有如下连接结构: A -> B -> C -> D
由于“A”是一个种子页面,它的深度为0.“B”的深度为1,依此类推。 您能够设置crawler4j抓取的网页的深度限制。 例如,若是将此限制设置为2,则不会抓取页面“D”。 要设置您可使用的最大深度:
crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling);
复制代码
简单地启用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);
复制代码
可是,您应该注意,它可能会使爬行速度稍慢。
用户代理字符串用于将您的搜寻器表示为Web服务器。 查看 here获取更过详细内容.默认状况下,crawler4j使用如下用户代理字符串:
"crawler4j (https://github.com/yasserg/crawler4j/)"
复制代码
可是,您能够覆盖它:
crawlConfig.setUserAgentString(userAgentString);
复制代码
Copyright (c) 2010-2017 Yasser Ganjisaffar
Published under Apache License 2.0, see LICENSE