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è)步驟:
- 分析需求(對(duì),需求分析非常重要疼蛾,不要告訴我你老師沒(méi)教你)
- 分析網(wǎng)頁(yè)源代碼肛跌,配合F12(沒(méi)有F12那么亂的網(wǎng)頁(yè)源代碼,你想看死我?)
- 編寫(xiě)正則表達(dá)式或者XPath表達(dá)式(就是前面說(shuō)的那個(gè)神器)
- 正式編寫(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