Python爬蟲 搜尋並下載圖片

SSBun發表於2017-12-13

本文是我學習Python爬蟲的筆記,一直想要再學一門語言來擴充套件自己的知識面,看了看各種語言主要使用的方向,最後決心還是來搞一搞Python.Python給我的第一印象就是語法簡潔,格式另類還有各種庫的支援,就喜歡這麼有個性的語言~為了以後深入的學習爬蟲,事先肯定是先把語法學了一遍,下面是我實現的一個小爬蟲,可以通過百度相簿利用關鍵字來搜尋圖片並下載~

###工具準備:

  • 不要多想,挑個IDE吧,我用的是PyCharm(免費的~嗯,今年剛剛免費的)
  • 開啟PyCharm的設定(找找在哪,我都是直接commond+,的,如果你有commond鍵的話)在Project下選擇Project Interpreter然後點選左下角的加號,在輸入框中輸入requests,收索後安裝,其實還有很多其他的安裝方法,使用pip,在終端中敲入那些程式碼,然後還有什麼其他的東西,不過還是這樣比較偷懶(其實前面的坑我都爬過了)
  • Python為最新版,2.7應該也沒問題,並未使用Scrapy爬蟲框架,也沒有使用lxml,僅僅使用re正則和requests網路請求

re和requests用法

  • re正則

re就是正則,主要是用來解析資料的,當我們拿到網頁的資料時需要從中提取處我們想要的資料,正則匹配就時其中的一個方法,至於正則的寫法,這裡就不在多講,想看的在這裡正規表示式30分鐘入門教程,而re的常用使用手法可以在我的這篇文章裡瞭解Python爬蟲-re(正規表示式)模組常用方法,這裡我們主要使用其re.findall("正規表示式","被匹配資料",匹配限制(例如:忽略大小寫))

  • requests網路請求

requests的封裝異常的強大,幾乎可以做任何形式的網路請求,這裡我們只是使用了其最簡單的get請求requests.get("url",timeout=5),詳細瞭解,可以看一下(requests快速入門)

具體的步驟

  • 首先是想清楚想要做什麼,你想要獲取什麼資料(沒有目標哪來的動力啊),這裡我們是想要通過百度圖片來後去圖片連結及內容,我想要搜尋關鍵字,並可以指定搜尋的資料量,選擇是否儲存及儲存的路徑~

  • 需求有了,就要去分析要爬去的網頁結構了,看一下我們的資料都在哪,我們這次要扒去的圖片來自百度圖片

  • 首先進入百度相簿,你所看見的頁面當向下滑動的時候可以不停的重新整理,這是一個動態的網頁,而我們可以選擇更簡單的方法,就是點選網頁上方的傳統翻頁版本

    QQ20160602-0@2x.png

  • 接下來就是我們熟悉的翻頁介面,你可以點選第幾頁來獲取更多的圖片

    QQ20160602-1@2x.png

  • 點選滑鼠的右鍵可以檢視網頁的原始碼,大概就是這個樣子的,我們get下來的資料,就是這個啦,我們需要在這裡面找到各個圖片的連結下一頁的連結,然而有點懵,這麼多的資料,我們想要的在哪裡呢?

    QQ20160602-2@2x.png

  • 不著急,我們可以通過瀏覽器的開發者工具來檢視網頁的元素,我用的是Chrome,開啟Developer Tools來檢視網頁樣式,當你的滑鼠從結構表中劃過時會實時顯示此段程式碼所對應的位置區域,我們可以通過此方法,快速的找到圖片所對應的位置:

    QQ20160602-3@2x.png
    找到了一張圖片的路徑和下一頁的路徑,我們可以在原始碼中搜尋結果找到他們的位置,並分析如何書寫正則來獲取資訊:
    QQ20160602-4@2x.png

  • 所有的資料都分析完畢了,這個時候就要開始寫我們的爬蟲了,看了這麼久,竟然一句程式碼都沒有:

import requests #首先匯入庫
import  re
複製程式碼
然後設定預設配置
複製程式碼
MaxSearchPage = 20 # 收索頁數
CurrentPage = 0 # 當前正在搜尋的頁數
DefaultPath = "/Users/caishilin/Desktop/pictures" # 預設儲存位置
NeedSave = 0 # 是否需要儲存
複製程式碼
圖片連結正則和下一頁的連結正則
複製程式碼
def imageFiler(content): # 通過正則獲取當前頁面的圖片地址陣列
          return re.findall('"objURL":"(.*?)"',content,re.S)
def nextSource(content): # 通過正則獲取下一頁的網址
          next = re.findall('<div id="page">.*<a href="(.*?)" class="n">',content,re.S)[0]
          print("---------" + "http://image.baidu.com" + next) 
          return next
複製程式碼
爬蟲主體
複製程式碼
def spidler(source):
          content = requests.get(source).text  # 通過連結獲取內容
          imageArr = imageFiler(content) # 獲取圖片陣列
          global CurrentPage
          print("Current page:" + str(CurrentPage) + "**********************************")
          for imageUrl in imageArr:
              print(imageUrl)
              global  NeedSave
              if NeedSave:  # 如果需要儲存儲存
                 global DefaultPath
                 try:                
                      picture = requests.get(imageUrl,timeout=10) # 下載圖片並設定超時時間,如果圖片地址錯誤就不繼續等待了
                 except:                
                      print("Download image error! errorUrl:" + imageUrl)                
                      continue            
                 pictureSavePath = DefaultPath + imageUrl.replace('/','') # 建立圖片儲存的路徑
                 fp = open(pictureSavePath,'wb') # 以寫入二進位制的方式開啟檔案            fp.write(picture.content)
                 fp.close()
           else:   
                global MaxSearchPage
                if CurrentPage <= MaxSearchPage:
                    if nextSource(content):
                        CurrentPage += 1                                         
                        spidler("http://image.baidu.com" + nextSource(content)) # 爬取完畢後通過下一頁地址繼續爬取
複製程式碼
爬蟲的開啟方法
複製程式碼
def  beginSearch(page=1,save=0,savePath="/users/caishilin/Desktop/pictures/"): # (page:爬取頁數,save:是否儲存,savePath:預設儲存路徑)
          global MaxSearchPage,NeedSave,DefaultPath
          MaxSearchPage = page
          NeedSave = save
          DefaultPath = savePath
          key = input("Please input you want search 
          StartSource = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=" + str(key) + "&ct=201326592&v=flip" # 分析連結可以得到,替換其`word`值後面的資料來收索關鍵詞
          spidler(StartSource)
複製程式碼
 呼叫開啟的方法就可以通過關鍵詞搜尋圖片了
複製程式碼
beginSearch(page=1,save=0)
複製程式碼

小結

** 因為對Python的理解還不是特別的深入,所以程式碼比較繁瑣,相比較爬蟲框架Scrapy來說,直接使用reqests和re顯得並不是特別的酷,但是這是學習理解爬蟲最好的方式,接下來我會陸陸續續將我學習爬蟲框架Scrapy的過程寫下來,有錯誤的地方請指正~**

相關文章