基于Crawler4j的WEB爬虫

一、WEB爬虫介绍

爬虫,Crawler,最早被用于搜索引擎收录页面,例如百度蜘蛛等等。说简单点,原理就是根据一些规则,获取url和页面,再从获取到的页面中继续提取url,一直进行下去。

现在爬虫不仅仅用于搜索引擎抓取页面,也大量用于数据分析、数据挖掘等方面,在大数据的今天,爬虫的作用越来越重要。WEB爬虫的具体作用可以参考以下知乎上的一篇文章:

有哪些网站用爬虫爬取能得到很有价值的数据?

当然只是获取到数据往往是不够的,还要对数据进行分析,提取出有用的、有价值的信息,这才是爬虫的正真目的。

二、Crawler4j介绍

爬虫工具有很多,比如nutch等等,就不再这里列举了,可以参考以下一篇文章:

GitHub 上有哪些优秀的 Java 爬虫项目?

Crawler4j是一个Java版的多线程爬虫工具,简单易用。以下是Crawler4j的github:

yasserg/crawler4j · GitHub

通过官方的示例就能很快写出一个简单的爬虫。而且它的配置也很简单和实用。

三、使用Crawler4j获取URL和HTML

现在我们来用Crawler4j实现一个简单的爬虫(以下代码摘自官方github,并做了部分解释)。

首先要引入依赖,我比较喜欢用maven,所以依赖如下:

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

然后定义一个我们自己的爬虫,只需要继承WebCrawler即可:

public class MyCrawler extends WebCrawler {//定义抓取规则,这里过滤了css、js等等非html的后缀private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg"+ "|png|mp3|mp4|zip|gz))$");//shouldVisit,应当被获取的url@Overridepublic boolean shouldVisit(Page referringPage, WebURL url) {String href = url.getURL().toLowerCase();return !FILTERS.matcher(href).matches()&& href.startsWith("http://www.ics.uci.edu/");}//当获取到匹配的URL时,进行处理,我们可以在这里写我们的处理逻辑@Overridepublic 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());}}
}

这样我们就建立好了一个可以只获取html链接的爬虫,但是它还是死的,需要一个类来启动和配置其他的抓取规则。

public class Controller {public static void main(String[] args) throws Exception {//爬虫状态存储文件夹,可以从这里边读取数据,以边恢复之前的爬取状态String crawlStorageFolder = "/data/crawl/root";//爬虫数量,也就是线程数,一般不超过CPU线程数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);//要爬取的起始地址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是多线程的,因此就设计到多线程下的如何收集数据的问题。
好在Crawler4j为我们提供了一个方法,可以返回一个线程结束的时候收集到的数据:

/*** The CrawlController instance that has created this crawler instance will* call this function just before terminating this crawler thread. Classes* that extend WebCrawler can override this function to pass their local* data to their controller. The controller then puts these local data in a* List that can then be used for processing the local data of crawlers (if needed).** @return currently NULL*/
public Object getMyLocalData() {return null;
}

大意如下:

创建此爬行器实例的爬行控制器实例将在终止此爬行器线程之前调用此函数。扩展WebRe爬行器的类可以重写该函数,以将它们的本地数据传递给它们的控制器。然后控制器将这些本地数据放在一个列表中,然后该列表可以用来处理爬虫的本地数据(如果需要的话)。

因此我们可以传入一个list或者map来存放这些数据:

public class HtmlCrawler extends WebCrawler {private Map<String,Page> map;public HtmlCrawler() {this.map = new HashMap<>();}@Overridepublic void visit(Page page) {if(page.getParseData() instanceof HtmlParseData) {String url = page.getWebURL().getURL();log.debug("URL: {}", url);page.setContentData(null);this.map.put(url, page);}}@Overridepublic Object getMyLocalData() {return map;}
}

我们以当前url为key,将获取的到的数据page放入map,然后我们就可以在爬取结束的时候调用CarwlerController的getLocalData()来获取这些数据。

五、测试版爬虫系统

基于Crawler4j,我设计了一个简单的带界面的爬虫系统,整合到我的个人博客中,地址如下:

老吴 - 爬虫

其中UserKey暂时为随机生成的字符串,也可以用唯一的固定值作为UserKey,这样即使在关闭浏览器的情况下,也会在后台自动抓取,并且当你在此输入相同的UserKey时,将获取到上一次的抓取结果。

因为服务器资源有限,所以限制抓取页面数量,并且会每半小时自动清理已经抓取完成但是用户并没有请求获取的数据。

另外,当你选中生成报表时,抓取的数据将会生成一个excel表格,可以下载到本地查看。

基于Crawler4j的WEB爬虫相关推荐

  1. 基于Crawler4j的Java爬虫实践

    基于Crawler4j的Java爬虫实践 1. Introduction 2. 系统架构 2.1 crawler4j 2.2 jsoup 2.3 Apache Commons CSV 2.4 mave ...

  2. 玩C一定用得到的19款Java开源Web爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...

  3. 19款Java开源Web爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...

  4. 玩大数据一定用得到的19款Java开源Web爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...

  5. 基于DOM的Web信息提取方法

    摘  要 文章提出一种基于DOM的Web信息提取方法,通过归纳学习获得被提取信息的定位路径,利用XPath和XSLT在数据定位和数据转换方面的特点编写提取模式,根据网页元素与DOM节点对应关系,判断所 ...

  6. python selenium爬虫_详解基于python +Selenium的爬虫

    详解基于python +Selenium的爬虫 一.背景 1. Selenium Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome.firefox等主 ...

  7. python网络爬虫_python小知识,基于Python 的网络爬虫技术分析

    在现阶段大数据的时代中,想要实现对数据的获取和分析,要先具备足够的数据源,网络爬虫技术就为其数据获取提供了良好的条件,且还能够实现对数据源的目的性采集. 在网络爬虫技术应用中,Python 脚本语言的 ...

  8. 使用实体框架核心和C#创建具有Dotnet核心的自定义Web爬虫程序

    目录 介绍 背景 爬虫的基础知识 一步一步开发DotnetCrawler eShopOnWeb Microsoft 项目使用示例 Visual Studio解决方案的项目结构 DotnetCrawle ...

  9. 【ShoppingWebCrawler】-C#开发的基于Webkit内核开源爬虫蜘蛛引擎

    概述 在各个电商平台发展日渐成熟的今天.很多时候,我们需要一些平台上的基础数据.比如:商品分类,分类下的商品详细,甚至业务订单数据.电商平台大多数提供了相应的业务接口.允许ISV接入,用来扩展自身平台 ...

最新文章

  1. 57 Node.js异步编程
  2. Python中知识点笔记
  3. SQL数据库入门基础
  4. 精妙SQL语句【转】
  5. 来自Airbnb、Netflix等公司的代码评审最佳实践
  6. Maven搭建SSM框架测试HTTP 接口
  7. 基于WF4的新平台-流程格式转换架构
  8. 前端工程师的基本工作流程
  9. 百万富翁 混淆电路
  10. linux chrome 缓存,Linux设置chrome缓存至内存,及开关机同步
  11. 知道创宇云安全发布服务器安全产品-365门神
  12. VR技术给我们的生活带来哪些影响
  13. 让华为小米抱团 统一推送联盟究竟是何方神圣?
  14. 100条养生、养心秘笈,值得一看
  15. 文本编辑--程序员专属技能
  16. NR协议学习——RLC
  17. mac系统按Esc键无法切换vim编辑模式
  18. 7-6 吃鱼还是吃肉 (20 分)
  19. python 黑白棋_python-黑白棋游戏需要说明
  20. 计算机维修工文明操作,初级计算机维修工操作题.doc

热门文章

  1. 使用CAD编辑器将dwg保存为CAD的办法
  2. 获取当月第一天和最后一天、获取前月的最后一天
  3. 分段式多级离心泵_分段式离心泵,多级分段式离心泵,分段式多级离心泵-长沙中联泵业...
  4. EasyRecovery15易恢复适用于Win和Mac的电脑数据恢复软件
  5. 黑苹果 macOS 10.10 on vmware15安装流程
  6. 网络RTK——区域改正参数法(FKP)
  7. 解决电脑独立显卡突然消失的问题
  8. python挂机脚本怎么运行_Python的自动操作(挂机)脚本相关1
  9. python图书管理实训报告总结_图书管理系统实验报告
  10. 基于jsp+ssm的高速公路收费管理系统