项目作者: fengzhizi715

项目描述 :
使用RxJava2 和 Java 8的特性开发的图片爬虫
高级语言: Java
项目地址: git://github.com/fengzhizi715/PicCrawler.git
创建时间: 2017-10-09T14:57:32Z
项目社区:https://github.com/fengzhizi715/PicCrawler

开源协议:Apache License 2.0

关键词:
crawler java-8 parallel rxjava2

下载


PicCrawler

@Tony沈哲 on weibo
Download
License

用于抓取图片的爬虫,支持一些简单的定制比如User-Agent、referer、header、cookies等

最初是为了批量抓取图片验证码,然后导入tensorflow进行训练,才有了这个库。

它的结构如下图所示

下载安装:

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

  1. repositories {
  2. mavenCentral()
  3. jcenter()
  4. }

Gradle:

  1. implementation 'com.cv4j.piccrawler:crawler:1.0.0'

Maven:

当项目使用Maven进行构建时,在pom.xml文件中添加以下库

  1. <repositories>
  2. <repository>
  3. <snapshots>
  4. <enabled>false</enabled>
  5. </snapshots>
  6. <id>central</id>
  7. <name>bintray</name>
  8. <url>http://jcenter.bintray.com</url>
  9. </repository>
  10. </repositories>

然后添加如下的依赖

  1. <dependency>
  2. <groupId>com.cv4j.piccrawler</groupId>
  3. <artifactId>crawler</artifactId>
  4. <version>1.0.0</version>
  5. <type>pom</type>
  6. </dependency>

使用方法:

1.1 下载单张图片

  1. 普通方式
  1. String url = "..."; // 图片的地址
  2. PicCrawlerClient.get()
  3. .timeOut(6000)
  4. .fileStrategy(new FileStrategy() {
  5. @Override
  6. public String filePath() {
  7. return "temp";
  8. }
  9. @Override
  10. public String picFormat() {
  11. return "png";
  12. }
  13. @Override
  14. public FileGenType genType() {
  15. return FileGenType.AUTO_INCREMENT;
  16. }
  17. })
  18. .repeat(200) // 重复200次
  19. .build()
  20. .downloadPic(url);
  1. 使用RxJava
  1. String url = "..."; // 图片的地址
  2. PicCrawlerClient.get()
  3. .timeOut(6000)
  4. .fileStrategy(new FileStrategy() {
  5. @Override
  6. public String filePath() {
  7. return "temp";
  8. }
  9. @Override
  10. public String picFormat() {
  11. return "png";
  12. }
  13. @Override
  14. public FileGenType genType() {
  15. return FileGenType.AUTO_INCREMENT;
  16. }
  17. })
  18. .repeat(200)
  19. .build()
  20. .downloadPicUseRx(url);
  1. 使用RxJava,下载之后的图片还能做后续的处理
  1. String url = "..."; // 图片的地址
  2. PicCrawlerClient.get()
  3. .timeOut(6000)
  4. .fileStrategy(new FileStrategy() {
  5. @Override
  6. public String filePath() {
  7. return "temp";
  8. }
  9. @Override
  10. public String picFormat() {
  11. return "png";
  12. }
  13. @Override
  14. public FileGenType genType() {
  15. return FileGenType.AUTO_INCREMENT;
  16. }
  17. })
  18. .repeat(20)
  19. .build()
  20. .downloadPicToFlowable(url)
  21. .subscribe(new Consumer<File>() {
  22. @Override
  23. public void accept(File file) throws Exception {
  24. // do something
  25. }
  26. });

1.2 下载多张图片

  1. List<String> urls = ...; // 多张图片地址的集合
  2. PicCrawlerClient.get()
  3. .timeOut(6000)
  4. .fileStrategy(new FileStrategy() {
  5. @Override
  6. public String filePath() {
  7. return "temp";
  8. }
  9. @Override
  10. public String picFormat() {
  11. return "png";
  12. }
  13. @Override
  14. public FileGenType genType() {
  15. return FileGenType.AUTO_INCREMENT;
  16. }
  17. })
  18. .build()
  19. .downloadPics(urls);

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

  1. String url = "..."; // 针对某一个网址
  2. PicCrawlerClient.get()
  3. .timeOut(6000)
  4. .fileStrategy(new FileStrategy() {
  5. @Override
  6. public String filePath() {
  7. return "temp";
  8. }
  9. @Override
  10. public String picFormat() {
  11. return "png";
  12. }
  13. @Override
  14. public FileGenType genType() {
  15. return FileGenType.AUTO_INCREMENT;
  16. }
  17. })
  18. .build()
  19. .downloadWebPageImages(url);

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

  1. List<String> urls = ...; // 多个网页的集合
  2. PicCrawlerClient.get()
  3. .timeOut(6000)
  4. .fileStrategy(new FileStrategy() {
  5. @Override
  6. public String filePath() {
  7. return "temp";
  8. }
  9. @Override
  10. public String picFormat() {
  11. return "png";
  12. }
  13. @Override
  14. public FileGenType genType() {
  15. return FileGenType.AUTO_INCREMENT;
  16. }
  17. })
  18. .build()
  19. .downloadWebPageImages(urls);

1.5 通过代理使用图片爬虫

如果有多个代理的话,内部使用轮询的方式切换代理。

  1. String url = ...; // 针对某一个网址
  2. PicCrawlerClient.get()
  3. .timeOut(6000)
  4. .fileStrategy(new FileStrategy() {
  5. @Override
  6. public String filePath() {
  7. return "temp";
  8. }
  9. @Override
  10. public String picFormat() {
  11. return "png";
  12. }
  13. @Override
  14. public FileGenType genType() {
  15. return FileGenType.AUTO_INCREMENT;
  16. }
  17. })
  18. .addProxy(new Proxy("xxx.xx.xx.xx",xxxx))
  19. .addProxy(new Proxy("xxx.xx.xx.xx",xxxx))
  20. .build()
  21. .downloadWebPageImages(url);

CrawlerClient也支持使用addProxyPool()传递一个代理列表。

爬虫在工作中,如果发现代理不可用内部会有策略会代理池中丢弃该不可用的代理。

1.6 针对防盗链的图片

如果图片有防盗链接,可以使用referer()方法,传入网站的网址。就可以愉快的下载图片了。

对于懒人还有一个方法autoReferer(),可以不必传入网站的网址。

1.7 增加对Kotlin的支持,可以使用DSL的方式来使用图片爬虫

  1. 下载单张图片
  1. fun main(args: Array<String>) {
  2. downloadPic {
  3. url = "..."
  4. timeOut = 6000
  5. repeat = 20
  6. }
  7. }
  1. 下载某个网页的全部图片
  1. fun main(args: Array<String>) {
  2. downloadWebPageImages {
  3. url = "..."
  4. timeOut = 6000
  5. autoReferer = true
  6. }
  7. }

1.8 增加了通过Selenium模拟页面滚动来抓取网页图片

需要使用Selenium的话,在单独的crawler-selenium module中

  1. SeleniumCrawlerClient client = new SeleniumCrawlerClient();
  2. client.downloadPic("...",3);

在这里webdriver采用chromedriver,对于不同的操作系统chromedriver需要使用对应的版本。

专业的爬虫

笔者开发的专业的爬虫框架: NetDiscovery

ChangeLog

版本更新记录

联系方式:

QQ交流群:490882934

Java与Android技术栈:每周更新推送原创技术文章,欢迎扫描下方的公众号二维码并关注,期待与您的共同成长和进步。

License

  1. Copyright (C) 2017 Tony Shen.
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.