基于RxJava2实现的简单图片爬虫的方法

时间:2021-05-19

今年十月份以来,跟朋友尝试导入一些图片到tensorflow来生成模型,这就需要大量的图片。刚开始我只写了一个简单的HttpClient程序来抓取图片,后来为了通用性索性写一个简单的图片爬虫程序。它可以用于抓取单张图片、多张图片、某个网页下的所有图片、多个网页下的所有图片。

github地址:https://github.com/fengzhizi715/PicCrawler

这个爬虫使用了HttpClient、RxJava2以及Java 8的一些特性。它支持一些简单的定制,比如定制User-Agent、Referer、Cookies等。

一.下载安装:

对于Java项目如果使用gradle构建,由于默认不是使用jcenter,需要在相应module的build.gradle中配置

repositories { mavenCentral() jcenter()}

Gradle:

compile 'com.cv4j.piccrawler:crawler:0.2.1'

Maven:

<dependency> <groupId>com.cv4j.piccrawler</groupId> <artifactId>crawler</artifactId> <version>0.2.1</version> <type>pom</type></dependency>

二.使用方法:

2.1 下载单张图片

1、普通方式

String url = "..."; // 图片的地址 CrawlerClient.get() .timeOut(6000) .fileStrategy(new FileStrategy() { @Override public String filePath() { return "temp"; } @Override public String picFormat() { return "png"; } @Override public FileGenType genType() { return FileGenType.AUTO_INCREMENT; } }) .repeat(200) // 重复200次 .build() .downloadPic(url);

在这里,timeOut()表示网络请求的超时时间。fileStrategy()表示存放的目录、文件使用的格式、生成的文件时使用何种策略。repeat()表示对该图片请求重复的次数。

PicCrawler支持多种文件的生成策略,比如随机生成文件名、从1开始自增长地生成文件名、生成指定的文件名等等。

下图显示了使用该程序对某验证码的图片下载200次。


2、使用RxJava的方式下载

String url = "..."; // 图片的地址 CrawlerClient.get() .timeOut(6000) .fileStrategy(new FileStrategy() { @Override public String filePath() { return "temp"; } @Override public String picFormat() { return "png"; } @Override public FileGenType genType() { return FileGenType.AUTO_INCREMENT; } }) .repeat(200) .build() .downloadPicUseRx(url);

3、使用RxJava,下载之后的图片还能做后续的处理

String url = "..."; // 图片的地址 CrawlerClient.get() .timeOut(6000) .fileStrategy(new FileStrategy() { @Override public String filePath() { return "temp"; } @Override public String picFormat() { return "png"; } @Override public FileGenType genType() { return FileGenType.AUTO_INCREMENT; } }) .repeat(200) .build() .downloadPicToFlowable(url) .subscribe(new Consumer<File>() { @Override public void accept(File file) throws Exception { // do something } });

在Consumer中,可以对文件做一些后续的处理。

2.2 下载多张图片

List<String> urls = ...; // 多张图片地址的集合 CrawlerClient.get() .timeOut(6000) .fileStrategy(new FileStrategy() { @Override public String filePath() { return "temp"; } @Override public String picFormat() { return "png"; } @Override public FileGenType genType() { return FileGenType.AUTO_INCREMENT; } }) .build() .downloadPics(urls);

2.3 下载某个网页的全部图片

String url = "http://pletableFuture.runAsync(() -> downloadPic(url)).get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }); } }

3.2 下载多个网页的全部图片

downloadWebPageImages()方法还支持传List集合,表示多个网页的地址。

/** * 下载多个网页的全部图片 * @param urls */ public void downloadWebPageImages(List<String> urls) { if (Preconditions.isNotBlank(urls)) { Flowable.fromIterable(urls) .parallel() .map(url->httpManager.createHttpWithGet(url)) .map(response->parseHtmlToImages(response)) .sequential() .subscribe(list -> downloadPics(list), throwable-> System.out.println(throwable.getMessage())); } }

在这里其实用到了ParallelFlowable,因为parallel()可以把Flowable转成ParallelFlowable。

总结

PicCrawler 是一个简单的图片爬虫,目前基本可以满足我的需求。未来要是有新的需求,我会不断添加功能。

在做PicCrawler时,其实还做了一个ProxyPool用于获取可用代理池的库,它也是基于RxJava2实现的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章