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

安装
使用Maven
使用最新版本的crawler4j,在pom.xml中添加如下片段:
XHTML
| 
 1 
2 
3 
4 
5 
 | 
 <dependency> 
    <groupId>edu.uci.ics</groupId> 
    <artifactId>crawler4j</artifactId> 
    <version>4.1</version> 
</dependency> 
 | 
不使用Maven
crawler4j的JAR包可以从releases page和Maven Central下载。 需要注意crawler4j包有几个要依赖的包。在releases page下的crawler4j-X.Y-with-dependencies.jar包含了crawler4j的所有的依赖包。可以下载并添加到你的classpath中。
快速开始
使用crawler4j需要创建一个继承WebCrawler的爬虫类。下面是个简单的例子:
Java
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
 | 
 public class MyCrawler extends WebCrawler { 
    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg" 
                                                           + "|png|mp3|mp3|zip|gz))$"); 
    /** 
     * This method receives two parameters. The first parameter is the page 
     * in which we have discovered this new url and the second parameter is 
     * the new url. You should implement this function to specify whether 
     * the given url should be crawled or not (based on your crawling logic). 
     * In this example, we are instructing the crawler to ignore urls that 
     * have css, js, git, ... extensions and to only accept urls that start 
     * with "http://www.ics.uci.edu/". In this case, we didn't need the 
     * referringPage parameter to make the decision. 
     */ 
     @Override 
     public boolean shouldVisit(Page referringPage, WebURL url) { 
         String href = url.getURL().toLowerCase(); 
         return !FILTERS.matcher(href).matches() 
                && href.startsWith("http://www.ics.uci.edu/"); 
     } 
     /** 
      * This function is called when a page is fetched and ready 
      * to be processed by your program. 
      */ 
     @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及其内容,例子中只允许抓取“www.ics.uci.edu”这个域的页面,不允许.css、.js和多媒体等文件。
 - visit:当URL下载完成会调用这个方法。你可以轻松获取下载页面的url, 文本, 链接, html,和唯一id等内容。
 
实现控制器类以制定抓取的种子(seed)、中间数据存储的文件夹、并发线程的数目:
Java
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
 | 
 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); 
        /* 
         * Instantiate the controller for this crawl. 
         */ 
        PageFetcher pageFetcher = new PageFetcher(config); 
        RobotstxtConfig robotstxtConfig = new RobotstxtConfig(); 
        RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher); 
        CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer); 
        /* 
         * For each crawl, you need to add some seed urls. These are the first 
         * URLs that are fetched and then the crawler starts following links 
         * which are found in these pages 
         */ 
        controller.addSeed("http://www.ics.uci.edu/~lopes/"); 
        controller.addSeed("http://www.ics.uci.edu/~welling/"); 
        controller.addSeed("http://www.ics.uci.edu/"); 
        /* 
         * Start the crawl. This is a blocking operation, meaning that your code 
         * will reach the line after this only when crawling is finished. 
         */ 
        controller.start(MyCrawler.class, numberOfCrawlers); 
    } 
} 
 | 
例子介绍
- Basic crawler:上述例子的全部源码及细节。
 - Image crawler:一个简单的图片爬虫:从指定域下载图片并存在指定文件夹。这个例子演示了怎样用crawler4j抓取二进制内容。
 - Collecting data from threads:这个例子演示了控制器怎样从抓取线程中收集数据/统计
 - Multiple crawlers:这个例子演示了如何同时运行两个不同的爬虫。
 - Shutdown crawling:这个例子演示了可以通过向控制器发送“shutdown”命令优雅的关闭抓取过程。
 
配置介绍
控制器类必须传一个类型为CrawlConfig的参数,用于配置crawler4j。下面描述了一些关于配置的细节。
抓取深度
默认情况下没有抓取深度的限制。可以通过配置来限制深度,比如,你有个种子页面A连接到B,B又连接到C,C又连接到D。结构如下:
Java
| 
 1 
 | 
 A --> B --> C --> D 
 | 
A是种子页面深度为0,B为1,C、D以此类推。如:当设置抓取深度是2是,就不会抓取页面D。抓取最大深度通过以下代码配置:
Java
| 
 1 
 | 
 crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling); 
 | 
页面抓取的最大数量
默认情况下没有抓取数量限制,可以通过以下代码配置:
Java
| 
 1 
 | 
 crawlConfig.setMaxPagesToFetch(maxPagesToFetch); 
 | 
其他限制
crawler4j是高效的,有着极快的抓取能力(比如:每秒可以抓取200个Wikipedia页面)。然而,这会给服务器带来很大的负荷(而服务器可能会阻断你的请求!)。所以,从1.3版开始,默认情况下,crawler4j每次请求前等待200毫秒。但是这个参数可以修改:
Java
| 
 1 
 | 
 crawlConfig.setPolitenessDelay(politenessDelay); 
 | 
代理
使用下代码配置爬虫通过代理:
Java
| 
 1 
2 
 | 
 crawlConfig.setProxyHost("proxyserver.example.com"); 
crawlConfig.setProxyPort(8080); 
 | 
如果你的代理需要认证:
Java
| 
 1 
2 
 | 
 crawlConfig.setProxyUsername(username); 
crawlConfig.getProxyPassword(password); 
 | 
抓取恢复
有时爬虫需要运行很长时间,但中途可能意外终止了。这种情况下,可以通过以下配置恢复停止/崩溃的爬虫:
Java
| 
 1 
 | 
 crawlConfig.setResumableCrawling(true); 
 | 
然而,这可能对抓取速度稍有影响。
User-agent字符串
User-agent字符串用于向web服务器表明你的爬虫。User-agent详解。 默认情况下crawler4j使用如下字符串: “crawler4j (https://github.com/yasserg/crawler4j/)” 你可以通过配置修改:
Java
| 
 1 
 | 
 crawlConfig.setUserAgentString(userAgentString); 
 | 
许可
Copyright (c) 2010-2015 Yasser Ganjisaffar
根据 Apache License 2.0发布
开源地址:https://github.com/yasserg/crawler4j
crawler4j:轻量级多线程网络爬虫的更多相关文章
- crawler4j:轻量级多线程网络爬虫实例
		
crawler4j是Java实现的开源网络爬虫.提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫. 下面实例结合jsoup(中文版API),javacvs 爬取自如租房网(http://sh ...
 - C# 多线程网络爬虫
		
原文 C#制作多线程处理强化版网络爬虫 上次做了一个帮公司妹子做了爬虫,不是很精致,这次公司项目里要用到,于是有做了一番修改,功能添加了网址图片采集,下载,线程处理界面网址图片下载等. 说说思路:首相 ...
 - [原创]一款基于Reactor线程模型的java网络爬虫框架
		
AJSprider 概述 AJSprider是笔者基于Reactor线程模式+Jsoup+HttpClient封装的一款轻量级java多线程网络爬虫框架,简单上手,小白也能玩爬虫, 使用本框架,只需要 ...
 - 【转】44款Java 网络爬虫开源软件
		
原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...
 - 开源的49款Java 网络爬虫软件
		
参考地址 搜索引擎 Nutch Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting, ...
 - 156个Python网络爬虫资源
		
本列表包含Python网页抓取和数据处理相关的库. 网络相关 通用 urllib - 网络库(标准库) requests - 网络库 grab - 网络库(基于pycurl) pycurl - 网络库 ...
 - java之网络爬虫介绍
		
文章大纲 一.网络爬虫基本介绍二.java常见爬虫框架介绍三.WebCollector实战四.项目源码下载五.参考文章 一.网络爬虫基本介绍 1. 什么是网络爬虫 网络爬虫(又被称为网页蜘蛛, ...
 - 13个.Net开源的网络爬虫
		
请点击此处输入图片描述 1:.Net开源的跨平台爬虫框架 DotnetSpider Star:430 DotnetSpider这是国人开源的一个跨平台.高性能.轻量级的爬虫软件,采用 C# 开发.目前 ...
 - 推荐13个.Net开源的网络爬虫
		
1:.Net开源的跨平台爬虫框架 DotnetSpider Star:430 DotnetSpider这是国人开源的一个跨平台.高性能.轻量级的爬虫软件,采用 C# 开发.目前是.Net开源爬虫最为优 ...
 
随机推荐
- AngularJS  track by $index引起的思考
			
今天写了一段程序,只是一个简答的table数据绑定,但是绑定select的数据之后,发现ng-change事件失去了效果,不知道什么原因. 主要用到的代码如下: <div id="ri ...
 - How To Read a Paper.md
			
@ Titile How To Read a Paper.md @ author Keshav, 译 uuplusu # 1. Intro 1. 读论文重要 2. 没有人教 3. ...
 - 序列化魔术函数__sleep()和反序列化魔术函数__wakeup()
			
1.string serialize ( mixed $value )— 产生一个可存储的值的表示 serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方. ...
 - Python: 使用zipfile+io模块在内存中进行zip操作
			
#!/usr/bin/env python #coding=utf-8 ''' 版权所有 (c) 2014 yao_yu (http://blog.csdn.net/yao_yu_126) 本代码采用 ...
 - 关于android app两次点击返回键退出的处理
			
现在的android app在开发时,引入了两次点击返回键退出app的设计 为了避免用户误触,这个设计很人性化 中文网上社区有些同学贴了一些实现的例子,我觉得不是很好 代码如下 public bool ...
 - VS2012编译生成XP可以执行的程序
			
首先需要的就是下载VS2012的Update 4更新包,然后打开项目的属性页,在 配置属性->平台工具集 选项中选择 Visual Studio 2012 - Windows XP (v110_ ...
 - PI数据库的使用-PI System Management Tools
			
1.PI连接管理器 2.标记搜索 3.当前值
 - JQUERY 插件开发——LAZYLOADIMG(预加载和延迟加载图片)
			
开发背景 本插件开发是近期写的最后一个插件了,接下来我想把最近研究的redis最为一个系列阐述下.当然Jquery插件开发是我个人爱好,我不会停止,在将来的开发中我会继续完善,当然也会坚持写这个系列的 ...
 - bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++
			
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 72 Solved: 44[Submit][Status] Descript ...
 - [CF Round #295 div2] C. DNA Alignment 【观察与思考0.0】
			
题目链接:C. DNA Alignment 题目大意就不写了,因为叙述会比较麻烦..还是直接看英文题面吧. 题目分析 经过观察与思考,可以发现,构造的串 T 的每一个字符都与给定串 S 的每一个字符匹 ...