底層:?jiǎn)尉W(wǎng)頁(yè)多圖下載捏萍,難度中等--wh02

底層:?jiǎn)尉W(wǎng)頁(yè)多圖下載

一系冗、實(shí)驗(yàn)說(shuō)明

1.1. 環(huán)境登錄

無(wú)需密碼自動(dòng)登錄,系統(tǒng)用戶名shiyanlou

1.2. 環(huán)境介紹

本實(shí)驗(yàn)環(huán)境采用帶桌面的Ubuntu Linux環(huán)境绢记,實(shí)驗(yàn)中會(huì)用到桌面上的程序:

  1. Xfce終端: Linux命令行終端扁达,打開(kāi)后會(huì)進(jìn)入shell環(huán)境,可以使用Linux命令
  2. Firefox:瀏覽器蠢熄,可以用在需要前端界面的課程里罩驻,只需要打開(kāi)環(huán)境里寫的HTML/JS頁(yè)面即可
  3. GVim:非常好用的編輯器,最簡(jiǎn)單的用法可以參考課程Vim編輯器

1.3. 環(huán)境使用

使用GVim編輯器輸入實(shí)驗(yàn)所需的代碼及文件护赊,使用Xfce終端運(yùn)行所需命令進(jìn)行操作惠遏。

實(shí)驗(yàn)報(bào)告可以在個(gè)人主頁(yè)中查看,其中含有每次實(shí)驗(yàn)的截圖及筆記骏啰,以及每次實(shí)驗(yàn)的有效學(xué)習(xí)時(shí)間(指的是在實(shí)驗(yàn)桌面內(nèi)操作的時(shí)間节吮,如果沒(méi)有操作,系統(tǒng)會(huì)記錄為發(fā)呆時(shí)間)判耕。這些都是您學(xué)習(xí)的真實(shí)性證明透绩。

實(shí)驗(yàn)樓虛擬機(jī),自帶了python2.X和python3.X版本壁熄,無(wú)需安裝帚豪,本實(shí)驗(yàn)基于 python2。

二草丧、課程介紹

這一節(jié)呢狸臣,利用上一節(jié)提到的知識(shí)點(diǎn),進(jìn)行單網(wǎng)頁(yè)的圖片爬取和下載至本地

三昌执、功能詳解

  • 從網(wǎng)頁(yè)的html中烛亦,獲取我們需要的圖片鏈接,打開(kāi)網(wǎng)頁(yè)懂拾,這個(gè)頁(yè)面下煤禽,一共有10張圖片是我們需要爬取的,查看網(wǎng)頁(yè)源碼岖赋,找到這十張圖片的代碼檬果,都是
    的格式,但是除了這幾張,該網(wǎng)頁(yè)里面其他的圖片也是用img標(biāo)簽选脊,所有只用img匹配杭抠,是不太好控制正確率的,另外我在ubuntu下用spy
  • der查閱這個(gè)鏈接html時(shí)中文全為亂碼知牌,我也就放棄了中文匹配祈争,我用的笨方法就是先找父標(biāo)簽,依次往里直至尋找到img標(biāo)簽角寸,具體路徑如下

body標(biāo)簽 -> wrapper -> container -> pagecontent -> maincontent -> postContent -> picture -> p (查閱HTML源碼菩混,我只用了后面三個(gè))

匹配用到的正則表達(dá)式(我用id和class匹配):
'<div.*?class="postContent.*?>.*?<p>(.*?)</p>' 獲取圖片鏈接那段html代碼
'<div.*?id="picture.*?>.*?<p>(.*?)</p>' 查閱上級(jí)獲得的html中,picture那塊代碼
'<img.*?src="(.*?)".*?>' 從上一個(gè)表達(dá)式中扁藕,獲取圖片鏈接
  • 從鏈接中獲得圖片名沮峡,也是正則表達(dá)式獲取
'.*/(.*?.jpg)' 從圖片鏈接中,提取圖片名亿柑,這個(gè)是最簡(jiǎn)單的
  • 打開(kāi)圖片鏈接邢疙,在本地創(chuàng)建文件,保存望薄,這里呢疟游,有個(gè)小功能,保證以后更新不重復(fù)下載
判斷文件時(shí)候存在痕支,如果存在颁虐,不下載,節(jié)約時(shí)間
如果文件不存在卧须,下一步創(chuàng)建新文件另绩,讀寫模式打開(kāi)
打開(kāi)圖片鏈接,將緩存寫入到文件中
關(guān)閉圖片文件花嘶,完成

以上呢就是本節(jié)內(nèi)容要實(shí)現(xiàn)的全部功能笋籽,接下來(lái)貼上代碼

四、功能代碼

這里呢椭员,按功能的先后順序车海,逆序貼代碼,不過(guò)代碼有點(diǎn)長(zhǎng)拆撼,我會(huì)在'def'后面附上注釋

#文件名:meizi_page_download
import urllib2
import os
import re
#loadurl()這個(gè)函數(shù)呢容劳,是防打開(kāi)鏈接超時(shí),如果超時(shí)返回空字符闸度,則主調(diào)函數(shù)會(huì)再次調(diào)用(while語(yǔ)句就可以實(shí)現(xiàn)),正常的話返回html代碼蚜印,一個(gè)網(wǎng)頁(yè)不算大莺禁,如果你的網(wǎng)絡(luò)超級(jí)好,timeout可以縮短
def loadurl(url):
    try:
        conn = urllib2.urlopen(url,timeout=5)
        html = conn.read()
        return html
    except urllib2.URLError:
        return ''
    except Exception:
        print("unkown exception in conn.read()")
        return ''
#這里是圖片保存的代碼被調(diào)函數(shù)窄赋,timeout=5設(shè)置超時(shí)時(shí)間哟冬,一個(gè)500k不到的圖片楼熄,5秒時(shí)間算長(zhǎng)的了,超時(shí)的話浩峡,返回失敗

def download(url,filename):
    try:
        conn = urllib2.urlopen(url,timeout=5)
        f = open(filename,'wb')
        f.write(conn.read())
        f.close()
        return True
    except urllib2.URLError:
        print 'load',url,'error'
        return False
    except Exception:
        print("unkown exception in conn.read()")
        return ''

#保存圖片的邏輯代碼塊
def save_pic(url,path):
    searchname = '.*/(.*?.jpg)'
    name = re.findall(searchname,url)
    filename = path +'/'+ name[0]
    
    print filename + ':start' #控制臺(tái)顯示信息
    #下面的代碼可岂,當(dāng)下載成功,break跳出就好了翰灾,如果存在缕粹,直接結(jié)束這個(gè)函數(shù)

    #定義了在下載圖片時(shí)遇到錯(cuò)誤的重試次數(shù)
    tryTimes = 3

    #當(dāng)重試次數(shù)沒(méi)有用完時(shí),則嘗試下載
    while tryTimes != 0:
        tryTimes -= 1
        if os.path.exists(filename):
            print filename,' exists, skip'
            return True
        elif os.path.exists(filename):
            os.mknod(filename)
        if download(url,filename):
            break

    if tryTimes != 0:
        print(filename + ": over")
    else:
        print(url + " :Failed to download")
    #控制臺(tái)顯示信息

#這個(gè)函數(shù)纸淮,相當(dāng)于一個(gè)中介平斩,我只是把for循環(huán)代碼提出就得到了這個(gè)函數(shù)    
def pic_list(picList,path):
    picurl = ''
    for picurl in picList:
        save_pic(picurl,path)
        
#圖片下載的主邏輯函數(shù),獲取圖片鏈接咽块,然后傳給pic_list()绘面,等結(jié)果(其實(shí)也沒(méi)結(jié)果,就是等退出)
def picurl(url,path):
    if os.path.exists(path):
        print path, 'exist'
    else:
        os.makedirs(path)
    html = ''
    while True:#這里和下載圖片是一個(gè)道理侈沪,細(xì)看即可
        html = loadurl(url)
        if html == '':
            print 'load', url,'error'
            continue
        else:
            break
    #其實(shí)這里呢揭璃,也是后期發(fā)現(xiàn)的一個(gè)小bug,這個(gè)網(wǎng)站的前后代碼有不同(目前而言發(fā)現(xiàn)的一處)亭罪,在rePicContent1運(yùn)行到后面瘦馍,是匹配不到的,導(dǎo)致rePicList返回的結(jié)果也是空皆撩,也就造成了這個(gè)符號(hào)[0]報(bào)錯(cuò)扣墩,因?yàn)闆](méi)有任何值,越界錯(cuò)誤,單線程會(huì)在這里報(bào)錯(cuò)并停止運(yùn)行扛吞。rePicContent2其實(shí)是我解決bug的另一個(gè)匹配正則式呻惕,被我發(fā)現(xiàn)的頁(yè)面是這個(gè)--http://www.meizitu.com/a/454.html,有興趣的去對(duì)比看看
    rePicContent1 = '<div.*?id="picture.*?>.*?<p>(.*?)</p>'
    rePicContent2 = '<div.*?class="postContent.*?>.*?<p>(.*?)</p>'
    rePicList = '<img.*?src="(.*?)".*?>'
    #這里對(duì)re.S做個(gè)介紹滥比,re.S是可以不添加的亚脆,加上之后,它的作用就是能忽略換行符盲泛,將兩條作為一條來(lái)匹配濒持。html代碼碰上換行的概率是很高的,所以我一致采用re.S(下文有配圖)
    picContent = re.findall(rePicContent1, html,re.S)
    if len(picContent) <=0:
        picContent = re.findall(rePicContent2, html,re.S)
    if len(picContent) <=0:
        print 'load false, over download this page and return'
        return False
    else:
        picList = re.findall(rePicList,picContent[0],re.S)
        pic_list(picList,path)
#url = 'http://www.meizitu.com/a/454.html'這兩行是我函數(shù)測(cè)試所用
#picurl(url,'/home/shiyanlou/Desktop/demo454')     

聲明寺滚,在運(yùn)行代碼的時(shí)候柑营,保險(xiǎn)起見(jiàn)別插入中文,特別是linux環(huán)境村视,容易報(bào)錯(cuò)官套,另外在這里附上re.S的截圖(沒(méi)有3吧)
res
res

代碼到這里就結(jié)束了,底層的圖片獲取鏈接并保存,完成奶赔,附上實(shí)驗(yàn)樓的截圖一張(一開(kāi)始報(bào)錯(cuò)惋嚎,第二次就好了,運(yùn)行之前,請(qǐng)確保你有外網(wǎng)權(quán)限站刑,用下Firefox看下網(wǎng)站就行另伍,如果沒(méi)用,請(qǐng)本機(jī)測(cè)試)
shiyanlou
shiyanlou

請(qǐng)繼續(xù)下一個(gè)實(shí)驗(yàn)

Python3教程绞旅、項(xiàng)目網(wǎng)站--傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摆尝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玻靡,更是在濱河造成了極大的恐慌结榄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囤捻,死亡現(xiàn)場(chǎng)離奇詭異臼朗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蝎土,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門视哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人誊涯,你說(shuō)我怎么就攤上這事挡毅。” “怎么了暴构?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵跪呈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我取逾,道長(zhǎng)耗绿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任砾隅,我火速辦了婚禮误阻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晴埂。我一直安慰自己究反,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布儒洛。 她就那樣靜靜地躺著精耐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琅锻。 梳的紋絲不亂的頭發(fā)上黍氮,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天唐含,我揣著相機(jī)與錄音浅浮,去河邊找鬼沫浆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滚秩,可吹牛的內(nèi)容都是我干的专执。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼郁油,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼本股!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起桐腌,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拄显,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后案站,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體躬审,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蟆盐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了承边。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡石挂,死狀恐怖博助,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痹愚,我是刑警寧澤富岳,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站拯腮,受9級(jí)特大地震影響窖式,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疾瓮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一脖镀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狼电,春花似錦蜒灰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至削祈,卻和暖如春翅溺,著一層夾襖步出監(jiān)牢的瞬間脑漫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工咙崎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留优幸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓褪猛,卻偏偏與公主長(zhǎng)得像网杆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伊滋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,770評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)碳却、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,064評(píng)論 4 62
  • 近幾天忙于緊張刺激的年前大拼殺磨刀霍霍階段笑旺,以為沒(méi)啥時(shí)間寫一些什么東西了昼浦,特別愛(ài)情這東西真不是你想寫就能寫的,...
    Real_LyRic閱讀 338評(píng)論 0 0
  • 環(huán)境 服務(wù)器(虛擬機(jī)): vm-master 10.211.55.23 vm-slave1 10.211....
    Charles__Jiang閱讀 995評(píng)論 0 2
  • 我,走在你的春天里…… 我物舒,走在你的春天里---------- 惺惺然 張開(kāi)了眼 看到了藍(lán) 又嗅...
    別具一格格閱讀 312評(píng)論 2 2