寫在前面
前段時間實習結束回來休息,某日閒逛無意間又打開了半次元,突然看見幾個好漂亮的coser小姐姐,就想存個圖片當壁紙(づ ̄3 ̄)づ╭❤~
然而又發現,很多小姐姐都設置了作品禁止保存或者是右下角帶水印
身爲一個重度強迫症患者,默默打開瀏覽器,看看能不能偷雞扒到原圖。。。
開始之前
1. 所有圖片都是各位作者付出辛苦勞動得來的,請尊重coser版權。
2. 圖片自己下載使用可以,請勿用於商業用途,轉載請先取得作者的同意並註明cn及鏈接。
3. 文末附有源碼地址,但代碼裏我留了幾個空白需要小夥伴們自己操作填寫,拒絕伸手黨。
下載原圖的思路
採用爬蟲的思路,將網頁html文本中的圖片鏈接提取出來,就能很方便地進行批量下載。
Step 1:瀏覽器控制檯分析html,找到原圖鏈接
-
這裏以喵老師的作品爲例,她的半次元主頁:Misa貞喵
-
使用chrome內核瀏覽器,打開她的某個作品頁面
https://bcy.net/item/detail/6406332008502419214 -
F12或右鍵審查元素,進入瀏覽器控制檯,選擇Element
-
然後不斷打開html元素,找到圖片所在的元素塊。一般圖片文件都在< img src="***">裏。
-
例如圖中的圖片鏈接就找到了。把鏈接最後的/w650去掉,就得到了原圖鏈接 https://img-bcy-qn.pstatp.com/coser/17684/post/4bo3/15d661d01b7e11e79153cf02b47363e0.jpg
Step 2:Java+PhantomJs獲取html文本,提取原圖url
-
由於半次元網站採用了Ajax技術異步加載圖片等內容,所以不能用傳統的爬蟲方法,那樣是無法獲取到圖片鏈接的。
-
爲了加載Ajax網頁,正統的方法是分析頁面js腳本中的http請求,然後通過請求得到數據文件。這裏我偷了個懶,通過PhantomJs模擬瀏覽器訪問網站得到Ajax加載後的頁面。
(也許有人覺得這就不算爬蟲了,無所謂啦,我只是想存個圖。不過後面也會提到用PhantomJs的缺點) -
Java+PhantomJs的使用方法請參考我的這篇文章:
項目 | Java獲取Ajax頁面(半次元)—— PhantomJS實現(帶cookie登錄) -
通過上面文章的方法,就能成功獲取的喵老師這篇作品的html文本了。
-
然後,或是通過正則或是通過其他插件,將url鏈接提取出來即可。這裏我用了org.apache.commons.lang3包中的StringUtils這個工具進行字符串分析截取。
這裏有它的官方jar包下載地址。
public String[] getAlbumNoteInfo(String html) {
String article = StringUtils.substringBetween(html, "<article>", "</article>");
String content = StringUtils.substringBetween(article, "class=\"inner-container\"", "class=\"declaration\"");
String[] strings = StringUtils.substringsBetween(content, "src=\"","/w650\"");
return strings;
}
- 如此,該頁面的圖片url就都能提取出來了。
Step 3:根據url批量下載圖片
- 這裏也不用多說,直接用Java寫個循環下載文件即可。嫌速度慢也可根據電腦性能及網速開多線程提高效率。
/**
* 下載圖片
*/
public void downloadImg(String imgUrl, String filePath) {
String fileName = imgUrl.substring(imgUrl.lastIndexOf("/"));
// 創建文件的目錄結構
File files = new File(filePath);
if(!files.exists()){// 判斷文件夾是否存在,如果不存在就創建一個文件夾
files.mkdirs();
}
try {
URL url = new URL(imgUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
// 創建文件
File file = new File(filePath + "//" + fileName);
FileOutputStream out = new FileOutputStream(file);
int i = 0;
while((i = is.read()) != -1){
out.write(i);
}
is.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("下載完成:" + fileName);
}
- 結果如下
以上
原圖出處:#cos正片# #Fate/GrandOrder# #遠阪凜# 遠阪凜情人節禮裝ver.
遠阪凜cn:Misa貞喵
爲喵老師打call,現在沒你哄睡覺了每天晚睡好久嗚嗚
成果
本來挺簡單的東西沒想着寫多少,結果迫於懶癌晚期+強迫症。。。從幾十行代碼不斷擴展,慢慢地寫成了一個demo。。。
然後就是下了一堆圖。。。
結語
寫了幾天代碼,算是完成了一個半成品demo。
代碼目前可以根據作者主頁鏈接,開多線程下載該作者的全部圖片作品,並提取作者&作品的相關信息寫入文件,能夠下載作者頭像,將作品分文件夾存儲,方便查看展示。同時作者有更新的話,再次下載該作者作品會檢查信息,只下載更新的作品。一次操作,全部解決,我懶我任性。
該項目 源碼地址:https://github.com/JohnnyJYWu/bcy-webcrawler-Java
代碼不可直接運行,需要手動添加部分信息,如存儲地址及url鏈接等。
具體 使用方法 及 展示效果 請閱讀 README。
幾個注意的地方:
- 這是一篇Java爬蟲的文章,僅供交流。再次強調對各位coser及其作品版權的尊重,請勿用於商業用途。轉載請取得作者同意並註明鏈接!
- 很多coser上傳的都是原圖,每張圖片幾MB或者十幾MB都很正常,因此下載速度變慢也不稀奇。
- 相比而言,用PhantomJs來取Ajax頁面確實存在很多不穩定因素,速度也很慢。後續也許會考慮分析一下js的http請求來獲取數據,以及爬取更多資源如視頻之類的。
- 前端網站的迭代更新會很快,可能過段時間半次元改前端了爬蟲就會失效。所以本文及我的GitHub項目旨在提供一個解決方法,不保證能長期使用。
- 如果有任何問題可在評論留言,或在GitHub發佈issue,我會盡量及時查看回復。
希望這篇文章對你有幫助~
第一次寫博,有不足之處歡迎各位大佬批評指正。
我的GitHub:https://github.com/JohnnyJYWu