【圖文詳解】python爬蟲實戰——5分鐘作個圖片自動下載器

python爬蟲實戰——圖片自動下載器

以前介紹了那麼多基本知識【Python爬蟲】入門知識,(沒看的先去看!!)你們也估計手癢了。想要實際作個小東西來看看,畢竟:html

talk is cheap show me the code!python

這個小工程的代碼都在github上,感興趣的本身去下載:
https://github.com/hk029/Pickupgit

製做爬蟲的基本步驟

順便經過這個小例子,能夠掌握一些有關製做爬蟲的基本的步驟。github

通常來講,製做一個爬蟲須要分如下幾個步驟:正則表達式

1. 分析需求(對,需求分析很是重要,不要告訴我你老師沒教你)
2. 分析網頁源代碼,配合F12(沒有F12那麼亂的網頁源代碼,你想看死我?)
3. 編寫正則表達式或者XPath表達式(就是前面說的那個神器)
4. 正式編寫python爬蟲代碼
緩存

效果

運行:markdown

 

 

恩,讓我輸入關鍵詞,讓我想一想,輸入什麼好呢?好像有點暴露愛好了。python爬蟲

 

 

回車工具

 

 

好像開始下載了!好贊!,我看看下載的圖片,哇瞬間我感受我又補充了好多表情包….學習

 

 

好了,差很少就是這麼個東西。

需求分析

」我想要圖片,我又不想上網搜「
」最好還能自動下載」
……

這就是需求,好了,咱們開始分析需求,至少要實現兩個功能,一是搜索圖片,二是自動下載。

首先,搜索圖片,最容易想到的就是爬百度圖片的結果,好,那咱們就上百度圖片看看

 

 

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

咱們試着搜一個東西,我打一個暴字,出來一系列搜索結果,這說明什麼….

 

 

隨便找一個回車

 

 

好了,咱們已經看到了不少圖片了,若是咱們能把這裏面的圖片都爬下來就行了。咱們看見網址裏有關鍵詞信息

 

 

咱們試着在網址直接換下關鍵詞,跳轉了有沒有!

 

 

這樣,能夠經過這個網址查找特定的關鍵詞的圖片,因此理論上,咱們能夠不用打開網頁就能搜索特定的圖片了。下個問題就是如何實現自動下載,其實利用以前的知識,咱們知道能夠用request,獲取圖片的網址,而後把它爬下來,保存成.jpg就好了。

因此這個項目就應該能夠完成了。

分析網頁

好了,咱們開始作下一步,分析網頁源代碼。這裏 我先切換回傳統頁面,爲何這樣作,由於目前百度圖片採用的是瀑布流模式,動態加載圖片,處理起來很麻煩,傳統的翻頁界面就好不少了。

 

 

這裏還一個技巧,就是:能爬手機版就不要爬電腦版,由於手機版的代碼很清晰,很容易獲取須要的內容。

好了,切換回傳統版本了,仍是有頁碼的看的舒服。

 

 

咱們點擊右鍵,查看源代碼

 

 

這都是什麼鬼,怎麼可能看清!!

 

 

這個時候,就要用F12了,開發者工具!咱們回到上一頁面,按F12,出來下面這個工具欄,咱們須要用的就是左上角那個東西,一個是鼠標跟隨,一個是切換手機版本,都對咱們頗有用。咱們這裏用第一個

 

 

而後選擇你想看源代碼的地方,就能夠發現,下面的代碼區自動定位到了這個位置,是否是很NB!

 

 

咱們複製這個地址

 

 

而後到剛纔的亂七八糟的源代碼裏搜索一下,發現它的位置了!(小樣!我還找不到你!)可是這裏咱們又疑惑了,這個圖片怎麼有這麼多地址,到底用哪一個呢?咱們能夠看到有thumbURL,middleURL,hoverURL,objURL

 

 

經過分析能夠知道,前面兩個是縮小的版本,hover是鼠標移動事後顯示的版本,objURL應該是咱們須要的,不信能夠打開這幾個網址看看,發現obj那個最大最清晰。

 

 

 

 

好了,找到了圖片位置,咱們就開始分析它的代碼。我看看是否是全部的objURL全是圖片

 

 

貌似都是以.jpg格式結尾的,那應該跑不了了,咱們能夠看到搜索出61條,說明應該有61個圖片

編寫正則表達式

經過前面的學習,寫出以下的一條正則表達式不難把?

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

編寫爬蟲代碼

好了,正式開始編寫爬蟲代碼了。這裏咱們就用了2個包,一個是正則,一個是requests包,以前也介紹過了,沒看的回去看!

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

而後咱們把剛纔的網址粘過來,傳入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)

理論有不少圖片,因此要循環,咱們打印出結果來看看,而後用request獲取網址,這裏因爲有些圖片可能存在網址打不開的狀況,加個5秒超時控制。

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 '【錯誤】當前圖片沒法下載'
        continue

好了,再就是把網址保存下來,咱們在事先在當前目錄創建一個picture目錄,把圖片都放進去,命名的時候,用數字命名把

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

整個代碼就是這樣:

#-*- 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 '【錯誤】當前圖片沒法下載'
        continue
    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 1

咱們運行一下,看效果(什麼你說這是什麼IDE感受很炫!?趕忙去裝Pycharm,Pycharm的配置和使用看這個文章!)!

 

 

好了咱們下載了58個圖片,咦剛纔不是應該是61個嗎?

 

 

咱們看,運行中出現了有一些圖片下載不了

 

咱們還看到有圖片沒顯示出來,打開網址看,發現確實沒了。

 

 

因此,百度有些圖片它緩存到了本身的機器上,因此你還能看見,可是實際鏈接已經失效

好了,如今自動下載問題解決了,那根據關鍵詞搜索圖片呢?只要改url就好了,我這裏把代碼寫下來了

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)

好了,享受你第一個圖片下載爬蟲吧!!

相關文章
相關標籤/搜索