crawler4j:轻量级多线程网络爬虫

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

crawler4j

安装

使用Maven

使用最新版本的crawler4j,在pom.xml中添加如下片段:

不使用Maven

crawler4j的JAR包可以从releases pageMaven Central下载。 需要注意crawler4j包有几个要依赖的包。在releases page下的crawler4j-X.Y-with-dependencies.jar包含了crawler4j的所有的依赖包。可以下载并添加到你的classpath中。

快速开始

使用crawler4j需要创建一个继承WebCrawler的爬虫类。下面是个简单的例子:

上面的例子覆盖了两个主要方法:

  • shouldVisit:这个方法决定了要抓取的URL及其内容,例子中只允许抓取“www.ics.uci.edu”这个域的页面,不允许.css、.js和多媒体等文件。
  • visit:当URL下载完成会调用这个方法。你可以轻松获取下载页面的url, 文本, 链接, html,和唯一id等内容。

实现控制器类以制定抓取的种子(seed)、中间数据存储的文件夹、并发线程的数目:

例子介绍

  • Basic crawler:上述例子的全部源码及细节。
  • Image crawler:一个简单的图片爬虫:从指定域下载图片并存在指定文件夹。这个例子演示了怎样用crawler4j抓取二进制内容。
  • Collecting data from threads:这个例子演示了控制器怎样从抓取线程中收集数据/统计
  • Multiple crawlers:这个例子演示了如何同时运行两个不同的爬虫。
  • Shutdown crawling:这个例子演示了可以通过向控制器发送“shutdown”命令优雅的关闭抓取过程。

配置介绍

控制器类必须传一个类型为CrawlConfig的参数,用于配置crawler4j。下面描述了一些关于配置的细节。

抓取深度

默认情况下没有抓取深度的限制。可以通过配置来限制深度,比如,你有个种子页面A连接到B,B又连接到C,C又连接到D。结构如下:

A是种子页面深度为0,B为1,C、D以此类推。如:当设置抓取深度是2是,就不会抓取页面D。抓取最大深度通过以下代码配置:

页面抓取的最大数量

默认情况下没有抓取数量限制,可以通过以下代码配置:

其他限制

crawler4j是高效的,有着极快的抓取能力(比如:每秒可以抓取200个Wikipedia页面)。然而,这会给服务器带来很大的负荷(而服务器可能会阻断你的请求!)。所以,从1.3版开始,默认情况下,crawler4j每次请求前等待200毫秒。但是这个参数可以修改:

代理

使用下代码配置爬虫通过代理:

如果你的代理需要认证:

抓取恢复

有时爬虫需要运行很长时间,但中途可能意外终止了。这种情况下,可以通过以下配置恢复停止/崩溃的爬虫:

然而,这可能对抓取速度稍有影响。

User-agent字符串

User-agent字符串用于向web服务器表明你的爬虫。User-agent详解。 默认情况下crawler4j使用如下字符串: “crawler4j (https://github.com/yasserg/crawler4j/)” 你可以通过配置修改:

许可

Copyright (c) 2010-2015 Yasser Ganjisaffar

根据 Apache License 2.0发布

开源地址:https://github.com/yasserg/crawler4j

打赏支持我整理更多优质资源,谢谢!

打赏编辑

打赏支持我整理更多优质资源,谢谢!

任选一种支付方式

2 4 收藏

资源整理者简介:刘立华

java开发,技术爱好者,乐于助人。 个人主页 · 贡献了32个资源 · 1 ·  


直接登录
最新评论
  • crawler4j爬图片时候,我想增加一个描述alt属性到webUrl怎么做,我增加属性,然后也修改了WebURLTupleBinding.java,并修改了HtmlContentHandler.java里面的代码
    else if (element == Element.IMG) {
    String imgSrc = attributes.getValue(“src”);
    String alt = attributes.getValue(“alt”);//此处debug时不为空
    if (imgSrc != null) {
    addToOutgoingUrls(imgSrc, localName,alt)
    }
    但是在:
    @Override
    public void visit(Page page) {
    String alt = page.getWebURL().getAlt();
    取到的值仍然是空的。请教一下大牛和同行应该怎么做,在weburl里加属性需要改哪些东西???

    • 唐尤华 工程师 01/23

      Hi,请到伯乐在线的小组发帖提问,支持微信登录。链接是:http://group.jobbole.com/
      在小组发帖,其他网友也能回复你哦。

推荐关注

按分类快速查找

关于资源导航
  • 伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1439 项工具资源。
    推送伯乐头条热点内容微信号:jobbole 分享干货的技术类微信号:iProgrammer