文档章节

java使用Crawler4j开发爬虫

B
 BaronChen
发布于 2016/12/01 22:11
字数 736
阅读 317
收藏 3

在爬虫开发中,常用的语言是python,但是也可以使用java来进行 开发,这样就可以利用java强大的库,下面就来介绍一下常用的java爬虫框架。

Crawler4j

官网:https://github.com/yasserg/crawler4j
开发顺序:

  1. 定制Controller层,用于控制爬虫的行为
  2. 使用main()直接开始程序即可

下面上代码:

// 此类用于控制爬虫爬取网页的图片,并且将图片存储在本地
public class ImageCrawler extends WebCrawler {
    // 用于过滤,使用正则表达式匹配
    private static final Pattern filters = Pattern.compile(
        ".*(\\.(css|js|mid|mp2|mp3|mp4|wav|avi|mov|mpeg|ram|m4v|pdf" +
        "|rm|smil|wmv|swf|wma|zip|rar|gz))$");
    // 用于确定需要爬取的资源类型(这边是爬取图片)
    private static final Pattern imgPatterns = Pattern.compile(".*(\\.(bmp|gif|jpe?g|png|tiff?))$");
    // 存储图片的文件夹
    private static File storageFolder;
    // 爬虫会爬取的域,可以是一个普通的URL
    private static String[] crawlDomains;

    // 初始化Controller
    public static void configure(String[] domain, String storageFolderName) {
        crawlDomains = domain;

        storageFolder = new File(storageFolderName);
        if (!storageFolder.exists()) {
            storageFolder.mkdirs();
        }
    }

    @Override
    // 确定需不需要下载url所指定的资源
    public boolean shouldVisit(Page referringPage, WebURL url) {
        String href = url.getURL().toLowerCase();
        // 和过滤器相匹配,不下载 
        if (filters.matcher(href).matches()) {
            return false;
        }

        // 是图片,下载
        if (imgPatterns.matcher(href).matches()) {
            return true;
        }

        // 如果是网页,进行url匹配,看是不是在需要下载的域内部
        for (String domain : crawlDomains) {
            // 在需要下载的域内
            if (href.startsWith(domain)) {
                return true;
            }
        }
        return false;
    }

    // shouldVisit为true,则会调用此函数
    @Override
    public void visit(Page page) {
        String url = page.getWebURL().getURL();

        // 如果是图片,并且图片大小在10kb以内,就不访问
        if (!imgPatterns.matcher(url).matches() ||
            !((page.getParseData() instanceof BinaryParseData) ||
              (page.getContentData().length < (10 * 1024)))) {
            return;
        }

        // get a unique name for storing this image
        // 获取图片的格式
        String extension = url.substring(url.lastIndexOf('.'));
        // 获取图片的名称,此处是随机值
        String hashedName = UUID.randomUUID() + extension;

        // 存储图片
        String filename = storageFolder.getAbsolutePath() + "/" + hashedName;
        try {
            // 写入文件系统,并且输出到磁盘
            Files.write(page.getContentData(), new File(filename));
            logger.info("Stored: {}", url);
        } catch (IOException iox) {
            logger.error("Failed to write file: " + filename, iox);
        }
    }
}

下面是启动爬虫所用:

public class ImageCrawlController {
    private static final Logger logger = LoggerFactory.getLogger(ImageCrawlController.class);

    public static void main(String[] args) throws Exception {
        // 爬虫参数控制,需要传入3个参数
        // 存储路径,这个是存储爬虫的运行时数据的
        // 并行线程数量
        // 图片存储路径
        if (args.length < 3) {
            logger.info("Needed parameters: ");
            logger.info("\t rootFolder (it will contain intermediate crawl data)");
            logger.info("\t numberOfCralwers (number of concurrent threads)");
            logger.info("\t storageFolder (a folder for storing downloaded images)");
            return;
        }

        String rootFolder = args[0];
        int numberOfCrawlers = Integer.parseInt(args[1]);
        String storageFolder = args[2];

        CrawlConfig config = new CrawlConfig();
        // 设置运行数据存储路径
        config.setCrawlStorageFolder(rootFolder);
        // 下载二进制数据(图片是二进制的数据)
        config.setIncludeBinaryContentInCrawling(true);
        // 需要爬的网站
        String[] crawlDomains = {"http://uci.edu/"};
        // PageFetcher是用于下载数据的 
        PageFetcher pageFetcher = new PageFetcher(config);
        // 用于控制是否遵守robots协议
        RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
        RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
        CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
        // 添加爬虫最初爬取的网页
        for (String domain : crawlDomains) {
            controller.addSeed(domain);
        }

        ImageCrawler.configure(crawlDomains, storageFolder);
        // 启动爬虫,使用并行
        controller.start(ImageCrawler.class, numberOfCrawlers);
    }
}

#Tip:本文所用代码是Crawler4j官方代码,只是稍作注解而已

© 著作权归作者所有

上一篇: vscode使用
B
粉丝 0
博文 11
码字总数 6676
作品 0
南京
私信 提问
如何使用开源java库 开源javaIDE零成本开发商业软件出售?????

开发商业软件需要闭源, 许多开源java库和开源javaIDE都免费, 但是开发者要遵守GPL,CGPL, MPL,等协议, 开发成的软件作品需要开源, 比如,eclipse .netbeans等等,GUI插件swt,windowsbuilder等也...

Mr.lin123
2012/07/16
301
3
玩大数据一定用得到的19款 Java 开源 Web 爬虫

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

两味真火
2016/09/23
17.1K
12
如何使用java写一个轻量的爬取动态内容 的爬虫?

我试图爬取google play的app评论,但是一个app的评论是通过ajax异步加载出来的。本来想用crawler4j,但是它不支持动态内容的抓取。有没有什么轻量的java爬虫推荐?...

StoneZh
2016/12/09
1K
4
Kotlin 喧嚣过后,谈谈 Java 程序员未来的出路

自从谷歌 I/O 2017宣布将支持 Kotlin 作为 Android 开发的 First-Class 语言,各种 Kotlin 能否取代 Java 的文章、争论层出不穷。 作为一名老 Java 程序员,心态是比较复杂的,虽然类似场面见...

两味真火
2017/05/27
6.5K
61
开发网络爬虫应该怎样选择爬虫框架?

有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?这里按照我的经验随便扯淡一下: 上面说的爬虫,基本可以分3类: 1.分布式爬虫:Nutch 2.JAV...

Airship
2015/11/03
370
0

没有更多内容

加载失败,请刷新页面

加载更多

使用QRCode.js生成二维码

什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。 基本用法 <div id="qrcode"></div><scrip......

前端老手
16分钟前
5
0
spring-web 目录结构

ls /opt/pkg/spring-framework/spring-web/src/main/java/org/springframework/web/accept cors HttpMediaTypeNotSupportedException.java j......

MtrS
29分钟前
3
0
Qt编写自定义控件55-手机通讯录

一、前言 前面几篇文章中的控件基本上难度系数接近0,甚至有凑控件数量的嫌疑,这次必须来一个强悍的控件,本控件难度系数在所有控件中排前五,代码量也不少,头文件都550行,实现文件1600行...

飞扬青云
46分钟前
29
0
C++与QML交互2:在QML中调用C++特性

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/xi_gua_gua/article/details/56991367 QML引擎(QQmlEngin...

shzwork
今天
3
0
【Go专家编程】defer这里有个坑

前言 项目中,有时为了让程序更健壮,也即不panic,我们或许会使用recover()来接收异常并处理。 比如以下代码: func NoPanic() {if err := recover(); err != nil {fmt.Println("Recov...

恋恋美食
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部