WawaKM:关于批量抓图的需求分析及设计
需求提出:當我們看到一個貼圖論壇或者一個網(wǎng)絡(luò)相冊,里面的MM圖片好多好多,手工一個一個下載的話,太慢了,有時候我們就想把一個網(wǎng)站里所有的美女圖片都下載下來。倒是有一些軟件能爬網(wǎng)下載圖片,比如GlobalFetch,還有一些離線下載的軟件webdup等,可以把網(wǎng)頁和圖片都下載下來,可是它抓下來的好多圖片都不符合要求,有的不是美女,所以有些人迫切需要一款能高度定制的圖片批量下載軟件。
另WawaKM團隊招募成員,有興趣的朋友過來看看哦,地址如下
http://www.cnblogs.com/onlytiancai/archive/2007/04/23/724428.html
下載地址:http://www.cnblogs.com/Files/onlytiancai/DownMM.rar
分析:咱先從人工的角度去分析,然后再考慮程序怎么實現(xiàn),比如一個貼圖論壇吧,咱先找到它MM貼圖版的網(wǎng)址,因為咱下MM不下別的對吧,然后這個版下面肯定都是一個一個帖子的列表,最下面肯定有翻頁,第一頁,第二頁,仔細分析會發(fā)現(xiàn),翻頁的鏈接是有規(guī)律的,肯定有一部分是數(shù)字遞增,其它部分不變,一般來說是這樣哦,比較變態(tài)的網(wǎng)站咱不考慮,這樣的話,咱就可以推斷出從第一頁到第100頁的鏈接地址。
然后每一頁上的帖子列表,它也有規(guī)律,往往是有個前綴,后面跟一串隨機數(shù)字,這好辦呀,咱不是會正則表達式嗎,把這個頁面上的帖子鏈接都給匹配出來。
然后就可以打開每個帖子了,一個帖子怎么也有10來個回復(fù)吧,一個帖子也就是10來張圖片,當然有的帖子回復(fù)特別長的話會翻頁,那咱不管了,咱批量下載圖片,就下載一個頁面好了,如果一個帖子還分頁了,咱還得判斷它到底分幾頁(一般帖子下面會有頁數(shù)的顯示,用正則可以找出來),再推斷出網(wǎng)址,再找圖片,咱費不著那勁,就下載第一頁的MM算了。當然了我說的情況是每個回復(fù)都是一個圖片哦。
好,分析的差不多了,以上的步驟我想程序大多都能實現(xiàn)的,regex,webrequest,.net里都有現(xiàn)成的,咱就模仿人為的去打開貼圖版面,點擊帖子連接,下載每個帖子上的圖片,再看下一個帖子,看完一頁,再翻下一頁。。。。咱不就能把圖片下載下來了嗎?
實現(xiàn):簡單,下載下來程序,自己反射后看源碼吧,程序?qū)懙谋容^粗糙。可改進的地方不少。說一下需要注意的幾個地方吧先
1、每次獲取遠程資源的時候sleep一秒,別把人家刷掛了,最好晚上過了12點再刷人家的網(wǎng)站,要不就太不厚道了,其實我也很討厭爬蟲和蜘蛛這種技術(shù)的,動不動就讓人家網(wǎng)站給歇菜了。我覺得這應(yīng)該做到,我在程序里把sleep的間隔時間都寫死了,省的別人把間隔時間從web.config里設(shè)置成0了。
2、防止重復(fù)下載,這要一套合理的邏輯,你可以獲取遠程的圖片后,取它的字節(jié)數(shù)組,然后再取MD5碼做為文件名,如果再下載的話,哈希之后的文件名已經(jīng)存在的話,那說明這兩個圖片是一張圖片,就不要再保存了,原理我就不說了,這就是所謂的摘要算法吧。我嫌這個性能慢,我是把圖片的地址哈希后做為文件名了。
3、還有就是斷點下載,這你也得設(shè)計一套合理的邏輯,下載半道兒停了,別下次不知道從哪兒下載了。凡是處理過的鏈接可以保存到一個txt里,下次再繼續(xù)下載的時候,取出待下載url列表和已處理url比較去掉已經(jīng)處理過的url,當然了我這個小程序?qū)懙谋容^急,我把已處理過的url是記錄下來了,但是再繼續(xù)下載的時候我沒做檢測,回頭你自己把這段邏輯加進去吧,反正原理是告訴你了。
4、所有的下載我都是同步操作的,為了提高性能,你可以改為異步操作。另外代碼寫的比較散,因為代碼比較少,你可以自己重構(gòu),加點設(shè)計模式啥的。
5、圖片下載多了,記著判斷磁盤剩余空間,小心下慢了,拋異常。另外如果處理一個url出錯的話,你直接忽略掉這個url下載下一個url就行了 ,下載圖片也是,那么多地址和圖片,處理的時候擋不住會有出錯的時候,忽略就行了,直接下一個,這也算是容錯吧,別有一個下載不下拉就hang住了。
說一下簡單的使用方法吧。
1、我們下把要處理的頁面獲取出來,比如說要獲取100頁的帖子的地址列表吧,需要先運行GetUrlList.exe程序,該程序會根據(jù)配置好的信息去獲取url列表,并保存到當前目錄的url.txt里,GetUrlList.exe.config是它的配置文件,各節(jié)點結(jié)實如下
url是帖子列表url表達式,打括號里面由一個遞增的數(shù)字填充,1就是第一頁,2就是第二頁,下面的starturl和endturl就是說開始頁和終止頁,endurl還給寫錯了,就那么著吧。
urlregx是匹配帖子列表頁上帖子鏈接地址的正則表達式,這個你自己看著寫就行了,urlpix是你匹配出來的圖片的前綴,加起來湊成一個圖片的整個下載地址.encoding是對方網(wǎng)頁的編碼,編碼不對,取下來可是亂碼,你也不可能匹配正確了。
??? <add key="url" value="http://bbs.xxxx.net/list_67_0_0_0_{0}.html" />
??? <add key="starturl" value="1" />
??? <add key="endturl" value="100" />
??? <add key="urlregx" value="post_\d+_1.html" />
??? <add key="urlpix" value="http://bbs.xxxx.net/" />
??? <add key="encoding" value="GB2312" />
2、獲取完帖子列表,我們就要用downmm.exe程序來遍歷url,下載圖片了,該程序需要讀取GetUrlList.exe生成的url.txt文件以獲取帖子列表,然后就把每個帖子下載下來,分析出上面的圖片節(jié)點,然后再解析出圖片的路徑,然后再根據(jù)圖片的路徑下載到本地,使用也非常簡單,雙擊就能用,配置文件如下。
? <add key="urllist" value="url.txt" />
? <add key="encoding" value="GB2312" />
urllist就是讀取帖子列表的路徑,encoding也是網(wǎng)頁的編碼,也許你要問了,圖片地址的正則表達式在哪兒配呀,在imgregx.txt文件里,第一行上寫入你要匹配的正則就行了,為什么不卸載.config里呀,因為.config里寫尖括號,引號的時候非常麻煩,而精確匹配指定圖片的正則 又有好多這樣的符號,所以不如直接寫到一個文本里讀取出來呢,正則如下<img.*?\s+src="(.*?)"+.*?javascript:if.*?\/>,懂正則的應(yīng)該都能看懂,關(guān)鍵是里面有個小括號哦,那是匹配結(jié)果的第一個分粗,也就是圖片的鏈接地址,整個正則匹配的是圖片元素,當然你寫的越精確,匹配的準確率一越高,你看我寫的正則就不是一個標準的圖片節(jié)點匹配表達式,我還加了javascript:等部分的限制,要不加限制網(wǎng)頁上所有的圖片就都下載下來了,關(guān)于這個正則怎么寫,你要好好的分析網(wǎng)頁,找出你要下載的圖片的共通點。而括號部分是地址,切記切記,不加括號就下載不到MM了,如果你寫的圖片正則表達式比較復(fù)雜,有多個括號,就是多個分組的話,那自己自己修改一下源碼來匹配吧,我代碼里寫死了,就取第一個分組做為圖片地址。
3、處理過的url放到“已處理的url.txt”了,你自己想法防止重復(fù)下載吧。
4、另外log.txt是自動生成的,里面是一些出錯的記錄。
沒了,歡迎根據(jù)這個思路作出一個專業(yè)的圖片下載工具哦,我以后也會把這個功能加入到wawaKM里,畢竟這也是信息獲取的一部分。
到俺發(fā)帖的時候,已經(jīng)下載了近70M的MM了,今天晚上不關(guān)機了,看看明天能下載完不,俺下載了100頁的帖子的MM,希望不要出錯,以后做個MM網(wǎng)站,放點google廣告賺錢,嘿嘿,另外誰了解圖像識別等方面的知識和我聯(lián)系哦,我要防止下載的圖片帶漏點的,還有長的丑的MM要自動過濾掉,不下載,誰有這方面的資料給分享一下哦,謝謝。
今天早晨一看,已經(jīng)下載了700M 美女了,趕緊停了先,今天晚上接著下載,要不影響別人訪問了,為了防止有人白天惡意下載別人的圖片,造成別人的網(wǎng)站無法訪問,我把下載程序里配置文件的參數(shù)改成假的了,之前下載下來直接就可以下載一個網(wǎng)站的MM,我現(xiàn)在改了,你可以直接琢磨著怎么寫配置參數(shù)來下載你想下載的圖片。可以試試百度空間和網(wǎng)易相冊,記著晚上下哦。
好了,我又改了一下,改成下載百度空間的劉德華了,下載下來示例直接使用就可以下載帥哥劉德華了。
轉(zhuǎn)載于:https://www.cnblogs.com/Athrun/archive/2007/04/26/727807.html
總結(jié)
以上是生活随笔為你收集整理的WawaKM:关于批量抓图的需求分析及设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt + FFmpeg 屏幕录制器
- 下一篇: python填空题_《Python程序设