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