用于抓取图片的爬虫,支持一些简单的定制比如User-Agent、referer、header、cookies等
最初是为了批量抓取图片验证码,然后导入tensorflow进行训练,才有了这个库。
对于Java项目如果使用gradle构建,由于默认不是使用jcenter,需要在相应module的build.gradle中配置
repositories {
mavenCentral()
jcenter()
}
Gradle:
implementation 'com.cv4j.piccrawler:crawler:1.0.0'
Maven:
当项目使用Maven进行构建时,在pom.xml文件中添加以下库
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>bintray</name>
<url>http://jcenter.bintray.com</url>
</repository>
</repositories>
然后添加如下的依赖
<dependency>
<groupId>com.cv4j.piccrawler</groupId>
<artifactId>crawler</artifactId>
<version>1.0.0</version>
<type>pom</type>
</dependency>
- 普通方式
String url = "..."; // 图片的地址
PicCrawlerClient.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);
- 使用RxJava
String url = "..."; // 图片的地址
PicCrawlerClient.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);
- 使用RxJava,下载之后的图片还能做后续的处理
String url = "..."; // 图片的地址
PicCrawlerClient.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(20)
.build()
.downloadPicToFlowable(url)
.subscribe(new Consumer<File>() {
@Override
public void accept(File file) throws Exception {
// do something
}
});
List<String> urls = ...; // 多张图片地址的集合
PicCrawlerClient.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);
String url = "..."; // 针对某一个网址
PicCrawlerClient.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()
.downloadWebPageImages(url);
List<String> urls = ...; // 多个网页的集合
PicCrawlerClient.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()
.downloadWebPageImages(urls);
如果有多个代理的话,内部使用轮询的方式切换代理。
String url = ...; // 针对某一个网址
PicCrawlerClient.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;
}
})
.addProxy(new Proxy("xxx.xx.xx.xx",xxxx))
.addProxy(new Proxy("xxx.xx.xx.xx",xxxx))
.build()
.downloadWebPageImages(url);
CrawlerClient也支持使用addProxyPool()传递一个代理列表。
爬虫在工作中,如果发现代理不可用内部会有策略会代理池中丢弃该不可用的代理。
如果图片有防盗链接,可以使用referer()方法,传入网站的网址。就可以愉快的下载图片了。
对于懒人还有一个方法autoReferer(),可以不必传入网站的网址。
- 下载单张图片
fun main(args: Array<String>) {
downloadPic {
url = "..."
timeOut = 6000
repeat = 20
}
}
- 下载某个网页的全部图片
fun main(args: Array<String>) {
downloadWebPageImages {
url = "..."
timeOut = 6000
autoReferer = true
}
}
需要使用Selenium的话,在单独的crawler-selenium module中
SeleniumCrawlerClient client = new SeleniumCrawlerClient();
client.downloadPic("...",3);
在这里webdriver采用chromedriver,对于不同的操作系统chromedriver需要使用对应的版本。
笔者开发的专业的爬虫框架: NetDiscovery
QQ交流群:490882934
Java与Android技术栈:每周更新推送原创技术文章,欢迎扫描下方的公众号二维码并关注,期待与您的共同成长和进步。
Copyright (C) 2017 Tony Shen.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.