1.圖片壓縮
起因:工作安排需要,爬蟲爬取了大量國外一些行業(yè)數(shù)據(jù)和圖片幾百G+。
存儲在阿里云存儲不是很貴但是流量費(fèi)太貴(當(dāng)日可能被爬了),最高一日近500 Gb,每小時rmb10(才看見賬單天真的以為那是10塊錢一天,原來是一個小時)。
考慮壓縮一下圖片:很多原圖是5M網(wǎng)上乃至10MB的
壓縮使用thumbnailator:https://github.com/coobird/thumbnailator
Thumbnails.of(in).scale(outputscale).outputQuality(outputQuality).toFile(outfile);
基本一句話搞定。
設(shè)計(jì)思路:遍歷文件夾文件,把大于需要壓縮的長度的文件執(zhí)行壓縮。
使用遞歸的思想:readfile()
File file = new File(fileDir);
File[] files = file.listFiles();// 獲取目錄下的所有文件或文件夾
if (files == null) {// 如果目錄為空,直接退出
throw new IOException();
}
// 遍歷,目錄下的所有文件
for (File f : files) {
if (f.exists() && f.isFile()) {
if (f.length() > max) {
String fileName = f.getName();
System.err.println("需要加入的文件" + fileName + "的大小是:" + f.length());// 字節(jié)數(shù)
}
} else if (f.isDirectory()) {
System.err.println(f.getAbsolutePath());
readFile(f.getAbsolutePath());
}
}
問題:
- javax.imageio.IIOException: Unsupported Image Type
查證之后解釋 P過的圖片保存為jpg格式時,默認(rèn)的模式是CMYK模式
CMYK?
CMYK (CYAN-MAGENTA-YELLOW-BLACK INK): 青色 - 品紅 - 黃色 - 黑色 RGB (RED-GREEN-BLUE) 紅 - 綠 - 藍(lán) [CMYK模式]當(dāng)陽光照射到一個物體上時,這個物體將吸收一部分光線,并將剩下的光線進(jìn)行反射,反射的光線就是 們所看見的物體顏色。
[RGB模式]是一種發(fā)光的色彩模式,你在一間黑暗的房間內(nèi)仍然可以看見屏幕上的內(nèi)容。
解決辦法:使用TwelveMonkeys:https://github.com/haraldk/TwelveMonkeys
最開始只引用了一個jpeg的jar
http://search.maven.org/remotecontent?filepath=com/twelvemonkeys/imageio/imageio-jpeg/3.3.2/imageio-jpeg-3.3.2.jar
出現(xiàn)
java.lang.ClassNotFoundException: com.twelvemonkeys.imageio.spi.ImageReade.....
好吧仔細(xì)看了一下說明

[dependencies]
英 [di'pend?nsiz] 美 [di'pend?nsiz]
- n. 依賴性,相關(guān)性;管理
所以把這幾個jar包都加進(jìn)去重試解決問題。
2. 爬取下載圖片 http response code :400
瀏覽器可以打開,但是程序不能下載。
直接使用圖片地址get 請求 結(jié)果是返回:
java.io.IOException: Server returned HTTP response code: 400
本來以為個別的但是經(jīng)過日志統(tǒng)計(jì) 竟然有差不多1%,80W張有9000多條失敗記錄,尤其是一些整篇都是。
如
再仔細(xì)一看,失敗的都是各種各樣的奇形怪狀的文字,想到了可能是字符集的問題?
修改之,無效,
再想想到可能是因?yàn)樘厥庾址谶B接中的java轉(zhuǎn)義有問題,最后嘗試解決辦法:
// 重新封裝
String fullimg = urlStr.substring(urlStr.lastIndexOf("/") + 1, urlStr.length());
String fore = urlStr.substring(0, urlStr.lastIndexOf("/")+1);
URL url = new URL(fore + java.net.URLEncoder.encode(fullimg));
// 需要轉(zhuǎn)義 特殊字符
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8087));
// HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
完美解決一部分問題:9000張又搞下來6000多張,開始解決新的問題:
3.java 下載圖片 Connect Reset
但是瀏覽器可以直接打開,
1.可能以為線程過多,線程池20個進(jìn)行下載,更改為5無效。
2.想著可能是“Content-Type”的原因,嘗試后加上:
conn.setRequestProperty("User-Agent", getusergent());
conn.setRequestProperty("Content-Type", "application/jpeg;charset=UTF-8");
3000多張圖又完美解決掉2000多張。