【圖文詳解】python爬蟲(chóng)實(shí)戰(zhàn)——5分鐘做個(gè)圖片自動(dòng)下載器

我想要(下)的,我現(xiàn)在就要

python爬蟲(chóng)實(shí)戰(zhàn)——圖片自動(dòng)下載器

之前介紹了那么多基本知識(shí)【Python爬蟲(chóng)】入門(mén)知識(shí)(沒(méi)看的趕緊去看)大家也估計(jì)手癢了庆杜。想要實(shí)際做個(gè)小東西來(lái)看看简软,畢竟:

talk is cheap show me the code!

這個(gè)小工程的代碼都在github上蛮拔,感興趣的自己去下載:
https://github.com/hk029/Pickup

制作爬蟲(chóng)的基本步驟

順便通過(guò)這個(gè)小例子,可以掌握一些有關(guān)制作爬蟲(chóng)的基本的步驟痹升。

一般來(lái)說(shuō)建炫,制作一個(gè)爬蟲(chóng)需要分以下幾個(gè)步驟:

  1. 分析需求(對(duì),需求分析非常重要疼蛾,不要告訴我你老師沒(méi)教你)
  2. 分析網(wǎng)頁(yè)源代碼肛跌,配合F12(沒(méi)有F12那么亂的網(wǎng)頁(yè)源代碼,你想看死我?)
  3. 編寫(xiě)正則表達(dá)式或者XPath表達(dá)式(就是前面說(shuō)的那個(gè)神器)
  4. 正式編寫(xiě)python爬蟲(chóng)代碼

效果

運(yùn)行:

恩惋砂,讓我輸入關(guān)鍵詞妒挎,讓我想想,輸入什么好呢西饵?好像有點(diǎn)暴露愛(ài)好了酝掩。

回車(chē)

好像開(kāi)始下載了!好贊眷柔!期虾,我看看下載的圖片,哇瞬間我感覺(jué)我又補(bǔ)充了好多表情包....

好了驯嘱,差不多就是這么個(gè)東西镶苞。

需求分析

"我想要圖片,我又不想上網(wǎng)搜“
"最好還能自動(dòng)下載"
……

這就是需求鞠评,好了茂蚓,我們開(kāi)始分析需求,至少要實(shí)現(xiàn)兩個(gè)功能剃幌,一是搜索圖片聋涨,二是自動(dòng)下載。

首先负乡,搜索圖片牍白,最容易想到的就是爬百度圖片的結(jié)果,好抖棘,那我們就上百度圖片看看

基本就是這樣茂腥,還挺漂亮的。

我們?cè)囍岩粋€(gè)東西切省,我打一個(gè)暴字最岗,出來(lái)一系列搜索結(jié)果,這說(shuō)明什么....

隨便找一個(gè)回車(chē)

好了数尿,我們已經(jīng)看到了很多圖片了仑性,如果我們能把這里面的圖片都爬下來(lái)就好了惶楼。我們看見(jiàn)網(wǎng)址里有關(guān)鍵詞信息


我們?cè)囍诰W(wǎng)址直接換下關(guān)鍵詞右蹦,跳轉(zhuǎn)了有沒(méi)有!

這樣歼捐,可以通過(guò)這個(gè)網(wǎng)址查找特定的關(guān)鍵詞的圖片何陆,所以理論上,我們可以不用打開(kāi)網(wǎng)頁(yè)就能搜索特定的圖片了豹储。下個(gè)問(wèn)題就是如何實(shí)現(xiàn)自動(dòng)下載贷盲,其實(shí)利用之前的知識(shí),我們知道可以用request,獲取圖片的網(wǎng)址巩剖,然后把它爬下來(lái)铝穷,保存成.jpg就行了。

所以這個(gè)項(xiàng)目就應(yīng)該可以完成了佳魔。

分析網(wǎng)頁(yè)

好了曙聂,我們開(kāi)始做下一步,分析網(wǎng)頁(yè)源代碼鞠鲜。這里 我先切換回傳統(tǒng)頁(yè)面宁脊,為什么這樣做,因?yàn)槟壳鞍俣葓D片采用的是瀑布流模式贤姆,動(dòng)態(tài)加載圖片榆苞,處理起來(lái)很麻煩,傳統(tǒng)的翻頁(yè)界面就好很多了霞捡。

這里還一個(gè)技巧坐漏,就是:能爬手機(jī)版就不要爬電腦版,因?yàn)槭謾C(jī)版的代碼很清晰碧信,很容易獲取需要的內(nèi)容仙畦。

好了,切換回傳統(tǒng)版本了音婶,還是有頁(yè)碼的看的舒服慨畸。

我們點(diǎn)擊右鍵,查看源代碼

這都是什么鬼衣式,怎么可能看清4缡俊!

這個(gè)時(shí)候碴卧,就要用F12了弱卡,開(kāi)發(fā)者工具!我們回到上一頁(yè)面住册,按F12婶博,出來(lái)下面這個(gè)工具欄,我們需要用的就是左上角那個(gè)東西荧飞,一個(gè)是鼠標(biāo)跟隨凡人,一個(gè)是切換手機(jī)版本,都對(duì)我們很有用叹阔。我們這里用第一個(gè)


然后選擇你想看源代碼的地方挠轴,就可以發(fā)現(xiàn),下面的代碼區(qū)自動(dòng)定位到了這個(gè)位置耳幢,是不是很NB!

我們復(fù)制這個(gè)地址

然后到剛才的亂七八糟的源代碼里搜索一下岸晦,發(fā)現(xiàn)它的位置了!(小樣!我還找不到你启上!)但是這里我們又疑惑了邢隧,這個(gè)圖片怎么有這么多地址,到底用哪個(gè)呢冈在?我們可以看到有thumbURL府框,middleURL,hoverURL讥邻,objURL

通過(guò)分析可以知道迫靖,前面兩個(gè)是縮小的版本,hover是鼠標(biāo)移動(dòng)過(guò)后顯示的版本兴使,objURL應(yīng)該是我們需要的系宜,不信可以打開(kāi)這幾個(gè)網(wǎng)址看看,發(fā)現(xiàn)obj那個(gè)最大最清晰发魄。

好了盹牧,找到了圖片位置,我們就開(kāi)始分析它的代碼励幼。我看看是不是所有的objURL全是圖片

貌似都是以.jpg格式結(jié)尾的汰寓,那應(yīng)該跑不了了,我們可以看到搜索出61條苹粟,說(shuō)明應(yīng)該有61個(gè)圖片

編寫(xiě)正則表達(dá)式

通過(guò)前面的學(xué)習(xí)有滑,寫(xiě)出如下的一條正則表達(dá)式不難把?

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

編寫(xiě)爬蟲(chóng)代碼

好了嵌削,正式開(kāi)始編寫(xiě)爬蟲(chóng)代碼了毛好。這里我們就用了2個(gè)包,一個(gè)是正則苛秕,一個(gè)是requests包肌访,之前也介紹過(guò)了,沒(méi)看的回去看艇劫!

#-*- coding:utf-8 -*-
import re
import requests

然后我們把剛才的網(wǎng)址粘過(guò)來(lái)吼驶,傳入requests,然后把正則表達(dá)式寫(xiě)好

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'



html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

理論有很多圖片店煞,所以要循環(huán)蟹演,我們打印出結(jié)果來(lái)看看,然后用request獲取網(wǎng)址浅缸,這里由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況轨帜,加個(gè)5秒超時(shí)控制魄咕。

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 0
for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=10)
    except requests.exceptions.ConnectionError:
        print '【錯(cuò)誤】當(dāng)前圖片無(wú)法下載'
        continue

好了衩椒,再就是把網(wǎng)址保存下來(lái),我們?cè)谑孪仍诋?dāng)前目錄建立一個(gè)picture目錄,把圖片都放進(jìn)去毛萌,命名的時(shí)候苟弛,用數(shù)字命名把

    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 1

整個(gè)代碼就是這樣:

#-*- coding:utf-8 -*-
import re
import requests

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'


html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 0
for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=10)
    except requests.exceptions.ConnectionError:
        print '【錯(cuò)誤】當(dāng)前圖片無(wú)法下載'
        continue
    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 1

我們運(yùn)行一下,看效果(什么你說(shuō)這是什么IDE感覺(jué)很炫8蠼膏秫?趕緊去裝Pycharm,Pycharm的配置和使用看這個(gè)文章W鲋选)!

好了我們下載了58個(gè)圖片缤削,咦剛才不是應(yīng)該是61個(gè)嗎?


我們看吹榴,運(yùn)行中出現(xiàn)了有一些圖片下載不了


我們還看到有圖片沒(méi)顯示出來(lái)亭敢,打開(kāi)網(wǎng)址看,發(fā)現(xiàn)確實(shí)沒(méi)了图筹。

所以帅刀,百度有些圖片它緩存到了自己的機(jī)器上,所以你還能看見(jiàn)远剩,但是實(shí)際連接已經(jīng)失效

好了扣溺,現(xiàn)在自動(dòng)下載問(wèn)題解決了,那根據(jù)關(guān)鍵詞搜索圖片呢瓜晤?只要改url就行了锥余,我這里把代碼寫(xiě)下來(lái)了

    word = raw_input("Input key word: ")
    url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&ct=201326592&v=flip'
    result = requests.get(url)

好了,享受你第一個(gè)圖片下載爬蟲(chóng)吧A÷印哈恰!當(dāng)然不只能下載百度的圖片拉,依葫蘆畫(huà)瓢志群,你現(xiàn)在應(yīng)該做很多事情了着绷,比如爬取頭像,爬淘寶展示圖锌云,或是...美女圖片荠医,捂臉。一切都憑客官你的想象了桑涎,當(dāng)然彬向,作為爬蟲(chóng)的第一個(gè)實(shí)例,雖然純用request已經(jīng)能解決很多問(wèn)題了攻冷,但是效率還是不夠高娃胆,如果想要高效爬取大量數(shù)據(jù),還是用scrapy吧等曼,我下面會(huì)講有關(guān)scrapy的一個(gè)實(shí)例:【圖文詳解】scrapy安裝與真的快速上手——爬取豆瓣9分榜單

這個(gè)小工程的代碼都在github上里烦,感興趣的自己去下載:
https://github.com/hk029/Pickup

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凿蒜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胁黑,更是在濱河造成了極大的恐慌废封,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丧蘸,死亡現(xiàn)場(chǎng)離奇詭異漂洋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)力喷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弟孟,“玉大人爽冕,你說(shuō)我怎么就攤上這事∨叮” “怎么了颈畸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)没讲。 經(jīng)常有香客問(wèn)我眯娱,道長(zhǎng),這世上最難降的妖魔是什么爬凑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任徙缴,我火速辦了婚禮,結(jié)果婚禮上嘁信,老公的妹妹穿的比我還像新娘于样。我一直安慰自己,他們只是感情好潘靖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布穿剖。 她就那樣靜靜地躺著,像睡著了一般卦溢。 火紅的嫁衣襯著肌膚如雪糊余。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天单寂,我揣著相機(jī)與錄音贬芥,去河邊找鬼。 笑死宣决,一個(gè)胖子當(dāng)著我的面吹牛蘸劈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尊沸,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼威沫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贤惯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起壹甥,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤救巷,失蹤者是張志新(化名)和其女友劉穎壶熏,沒(méi)想到半個(gè)月后句柠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棒假,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年溯职,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帽哑。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谜酒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妻枕,到底是詐尸還是另有隱情僻族,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布屡谐,位于F島的核電站述么,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏愕掏。R本人自食惡果不足惜度秘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饵撑。 院中可真熱鬧剑梳,春花似錦、人聲如沸滑潘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)语卤。三九已至侨赡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粱侣,已是汗流浹背羊壹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留齐婴,地道東北人油猫。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柠偶,于是被迫代替她去往敵國(guó)和親情妖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睬关,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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