你所需要的,不仅仅是一个好用的代理。
网站中的图片和网页在本质上是相同的,图片和网页的获取本质上都是根据URL从网站中获取网页/图片的字节数组(byte[]),浏览器会根据http响应头中的content-type信息来决定以网页还是图片的形式来展示资源。
完整的图片抓取示例工程可加群250108697在群文件中获取。
示例中的代码爬取了美食杰中的图片到指定的文件夹中,爬取结果如下图所示:
QQ截图20160529131825
核心代码:
package cn.edu.hfut.dmic.webcollector.example;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;
import cn.edu.hfut.dmic.webcollector.util.Config;
import cn.edu.hfut.dmic.webcollector.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
* WebCollector抓取图片的例子
* @author hu
*/
public class DemoImageCrawler extends BreadthCrawler {
//用于保存图片的文件夹
File downloadDir;
//原子性int,用于生成图片文件名
AtomicInteger imageId;
/**
*
* @param crawlPath 用于维护URL的文件夹
* @param downloadPath 用于保存图片的文件夹
*/
public DemoImageCrawler(String crawlPath, String downloadPath) {
super(crawlPath, true);
downloadDir = new File(downloadPath);
if(!downloadDir.exists()){
downloadDir.mkdirs();
}
computeImageId();
}
@Override
public void visit(Page page, CrawlDatums next) {
//根据http头中的Content-Type信息来判断当前资源是网页还是图片
String contentType = page.getResponse().getContentType();
if(contentType==null){
return;
}else if (contentType.contains("html")) {
//如果是网页,则抽取其中包含图片的URL,放入后续任务
Elements imgs = page.select("img[src]");
for (Element img : imgs) {
String imgSrc = img.attr("abs:src");
next.add(imgSrc);
}
} else if (contentType.startsWith("image")) {
//如果是图片,直接下载
String extensionName=contentType.split("/")[1];
String imageFileName=imageId.incrementAndGet()+"."+extensionName;
File imageFile=new File(downloadDir,imageFileName);
try {
FileUtils.writeFile(imageFile, page.getContent());
System.out.println("保存图片 "+page.getUrl()+" 到 "+imageFile.getAbsolutePath());
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
public static void main(String[] args) throws Exception {
DemoImageCrawler demoImageCrawler = new DemoImageCrawler("crawl", "download");
//添加种子URL
demoImageCrawler.addSeed("http://www.meishij.net/");
//限定爬取范围
demoImageCrawler.addRegex("http://www.meishij.net/.*");
//设置为断点爬取,否则每次开启爬虫都会重新爬取
demoImageCrawler.setResumable(true);
demoImageCrawler.setThreads(30);
Config.MAX_RECEIVE_SIZE = 1000 * 1000 * 10;
demoImageCrawler.start(3);
}
public void computeImageId(){
int maxId=-1;
for(File imageFile:downloadDir.listFiles()){
String fileName=imageFile.getName();
String idStr=fileName.split("\\.")[0];
int id=Integer.valueOf(idStr);
if(id>maxId){
maxId=id;
}
}
imageId=new AtomicInteger(maxId);
}
}