項目 | Java+PhantomJs爬蟲實戰——半次元 下載高清原圖

寫在前面

前段時間實習結束回來休息,某日閒逛無意間又打開了半次元,突然看見幾個好漂亮的coser小姐姐,就想存個圖片當壁紙(づ ̄3 ̄)づ╭❤~

然而又發現,很多小姐姐都設置了作品禁止保存或者是右下角帶水印

身爲一個重度強迫症患者,默默打開瀏覽器,看看能不能偷雞扒到原圖。。。


開始之前

\color{#FF0000}{本文旨在學習交流,希望所有閱讀的小夥伴們清楚以下幾點:}
1. 所有圖片都是各位作者付出辛苦勞動得來的,請尊重coser版權。
2. 圖片自己下載使用可以,請勿用於商業用途,轉載請先取得作者的同意並註明cn及鏈接。
3. 文末附有源碼地址,但代碼裏我留了幾個空白需要小夥伴們自己操作填寫,拒絕伸手黨。


下載原圖的思路

採用爬蟲的思路,將網頁html文本中的圖片鏈接提取出來,就能很方便地進行批量下載。

Step 1:瀏覽器控制檯分析html,找到原圖鏈接

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);
	}

成果

本來挺簡單的東西沒想着寫多少,結果迫於懶癌晚期+強迫症。。。從幾十行代碼不斷擴展,慢慢地寫成了一個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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章