2019独角兽企业重金招聘Python工程师标准>>>

在爬虫开发中,常用的语言是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;// 爬虫会爬取的域,可以是一个普通的URLprivate static String[] crawlDomains;// 初始化Controllerpublic 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,则会调用此函数@Overridepublic 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官方代码,只是稍作注解而已

转载于:https://my.oschina.net/u/3039639/blog/798512

java使用Crawler4j开发爬虫相关推荐

  1. Java用Jsoup开发爬虫获取双色球开奖信息

    想要获取双色球开奖信息,利用爬虫无疑是个比较方便的方式,针对简单的功能,除了python以外,Java也有比较便捷的方式--Jsoup 要获取指定位置的内容,需要知道该内容的标签,比如红球的标签是'l ...

  2. java游戏_java开发的七个金典游戏你小时候肯定玩过

    相信很多刚接触编程的同学,对于Java开发能做些什么.做过哪些游戏, 并不是特别清楚.那么今天小编就为大家分享下, 万能的Java开发过的那些经典游戏吧! 手机上的Java即J2ME(Java 2 M ...

  3. 使用Python语言开发爬虫有什么优势?

    网络爬虫分为很多种,Python爬虫也是其中的一种,那么使用Python语言开发爬虫有什么优势呢?来看看下面的详细介绍. Python分享:使用Python语言开发爬虫有什么优势?截止到目前,网络爬虫 ...

  4. Python开发爬虫完整代码解析

    Python开发爬虫完整代码解析 移除python ​三天时间,总算开发完了.说道爬虫,我觉得有几个东西需要特别注意,一个是队列,告诉程序,有哪些url要爬,第二个就是爬页面,肯定有元素缺失的,这个究 ...

  5. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)

    MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...

  6. java王者归来pdf_《JAVA WEB整合开发王者归来》刘京华.pdf

    全书分为9篇,内容层次清晰,难度循序渐进.第1篇为入门篇,内容包括JavaWeb开发概述等:第2篇为基础篇,内容包括Servlet技术.JSP技术.会话跟踪.过滤器Filter.监听器Listener ...

  7. JAVA card 应用开发(二) 在项目添加APPLET

    在上篇博文中.<JAVA card 应用开发创建第一个APPLET>.介绍了一个项目从无到有. 那么.我们建立了这个项目后,仅仅有一个应用(一个可选AID),假设我希望这个项目能够有多个应 ...

  8. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...

    主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...

  9. MyEclipse搭建java Web项目开发环境

    MyEclipse搭建java Web项目开发环境 首先,在开始搭建MyEclipse的开发环境之前,还有三步工具的安装需要完成,只要在安装配置成功之后才可以进入下面的java Web项目开发环境的搭 ...

最新文章

  1. 2020 年最具潜力的 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台(附链接)...
  2. 作业要求 20181127-1 附加作业 软件工程原则的应用实例分析
  3. 构建高可用ZooKeeper集群(转载)
  4. IPsec NAT穿越
  5. js笔记(9)之定时器数字时钟延时提示框
  6. js 中的console.log有什么作用
  7. c#获取或修改配置文件
  8. PCIe协议学习笔记
  9. 动态指针时钟:利用pyqt5制作指针钟表显示实时时间
  10. 德马克机械化波(td波)
  11. 关于“访问映射网络驱动器提示 本地设备名已在使用中,此连接尚未还原”的解决方法
  12. HBuilder手机Iphone运行提示“未受信用的企业级开发者”
  13. XP下IIS相关问题
  14. k8s——通过暴漏端口实现外部访问服务
  15. 华为畅享20 pro 和华为畅享Z 的区别 哪个好
  16. C++ 多态(动态多态)
  17. linux--Flex and Bison
  18. mysql bytes sent_MySQL服务器状态变量(mysqld)
  19. 【张亚飞】 Adobe Flash Player和Flash Player 检测工具包
  20. 软件无线电SDR应用(1):MATLAB信号产生

热门文章

  1. mysql 快速升级_MySQL 4到5的快速升级
  2. cstring判断是否包含子串_leetcode76. 最小覆盖子串
  3. oracle_sid只能有一个吗_第一次考教资!这些问题你都了解了吗?
  4. spring下连接mysql_使用Spring连接mysql数据库
  5. python二进制文件的读取与写入可以分别使用什么方法_用python实现读写文件常见操作方式...
  6. 计算机二级办公软件aoa 百度云,计算机二级办公 考生注意事项(二级AOA)
  7. python微信开发实例 pdf 百度网盘_用python看女神微信里的百度云资源有啥?
  8. java代码大全_各种java技术文章汇总整理
  9. python进程多任务
  10. 一个sql题目, 统计每年每月的信息