1. 程式人生 > 實用技巧 >python 圖片爬蟲系列三——爬取搜狗圖片庫中的圖片

python 圖片爬蟲系列三——爬取搜狗圖片庫中的圖片

來自《Python專案案例開發從入門到實戰》(清華大學出版社 鄭秋生 夏敏捷主編)中爬蟲應用——抓取百度圖片

本文爬取了搜狗圖片庫中的圖片,相對於爬取特定網頁中的圖片,爬取圖片庫中的圖片相對複雜一些,複雜的原因主要在於圖片的動態載入上。

圖片庫中的圖片太多,所以訪問網頁的時候不是一次性把圖片全部加載出來,而是根據滑鼠滾輪的行為進行動態載入。這會導致和之前的抓取特定網頁中的圖片有所區別,主要就是沒辦法通過之前檢視網頁原始碼的方法直接得到存放圖片的連結,而是需要在 Network 中的 XHR 下的 Headers 和 Preview 找到圖片存放網址的規律。

不用著急,後續會慢慢詳解。首先,我先貼出程式碼:

 1 import requests
 2 import urllib
 3 import json
 4 import os
 5 import shutil  # 用來刪除資料夾
 6 
 7 
 8 def getSogouImag(category, length, path):
 9     # 判斷資料夾是否存在,存在則刪除
10     if os.path.exists(path):
11         shutil.rmtree(path)
12     # 建立資料夾
13     os.mkdir(path)
14     # 得到要爬取的圖片數量
15     n = length
16 # 返回要爬取的類別 17 cate = category 18 # 根據搜尋的網頁得到儲存圖片的網頁是這個程式碼的難點,下面會詳細講解 19 url = 'https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=' + cate + '&tag=%E5%85%A8%E9%83%A8&start=0&len=' + str(n) 20 # 訪問網頁 21 imgs = requests.get(url) 22 # 獲取網頁內容 23 imgs_text = imgs.text
24 # 字串轉換成json格式 25 imgs_json = json.loads(imgs_text) 26 # 得到圖片資訊列表 27 imgs_items = imgs_json['all_items'] 28 m = 0 29 # 儲存每個想要儲存的圖片連結,為了後續 30 for i in imgs_items: 31 # thumbUrl儲存的圖片是大小為480*360的圖片網頁 32 img_url = i['thumbUrl'] 33 print('*********' + str(m) + '.png********' + 'Downloading...') 34 print('下載的url: ', img_url) 35 # 下載圖片並且儲存 36 urllib.request.urlretrieve(img_url, path+str(m) + '.jpg') 37 m = m + 1 38 print('Download complete !') 39 40 41 getSogouImag('桌布', 5, './img/') 42 43 pass

這裡,得到存放圖片的url是重點和難點,以下詳細講述怎麼得到url過程。

(1)首先還是開啟網頁原始碼(chrome可以點選滑鼠右鍵,按下 Inspect),這時如果你使用前三章(爬蟲系列一和系列二)抓取指定網頁中的圖片方法如正則表示式或者用CSS標籤篩選的方法都只會返回一張搜狗的圖示圖片,其他顯示的我們想要下載的圖片是看不到。

(2)我們要找到我們想要下載的圖片,就必須點選 Network, 選擇 XHR,然後就會看到在 Name 欄出現了getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA 的內容, 你用滑鼠越往下載入圖片,這個getAllRecomPicByTag的內容就會出現越多,你點選它,可以看到出現的就是存放圖片地址的 API 。

這裡,你可以點選Preview,觀察這個 json 陣列,一層層的開啟all_items 就可以看到裡面存放的就是圖片的地址,想明白了這就是我們可以找到圖片連結的地方,那麼就可以確定我們想要找的圖片連結就在 Headers 中。

(3)點選 Headers 就可以找到它們所對應的 url 連結。

這個Request URL 連結類似如下樣子:

https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=0&len=15&width=1920&height=1080

我們猜想這個應該就是搜狗圖片存放圖片連結的 url,因此我們來解析一下。首先看 category 和 tag 後面那一串應該是字元的編碼,查了下%E5%A3%81%E7%BA%B8是“桌布” 的編碼,而%E5%85%A8%E9%83%是 “全部” 的編碼,所以說,上面的連結和如下的連結是等效的:

https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=桌布&tag=全部&start=0&len=15&width=1920&height=1080

網頁開啟如下圖所示:

此外,start 是開始下標,len 是長度,即圖片的數量,所以通過這些資訊我們可以給 url 傳入引數,使之搜尋的更加靈活,如下所示:

url = 'https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=' + cate + '&tag=%E5%85%A8%E9%83%A8&start=0&len=' + str(n)

其中,cate 和 n 都是可以自定義的變數,分別表示要搜尋的類別和爬取的圖片數量。

以上就是使用 python 動態抓取圖片庫中圖片的詳解,希望能幫助大家理解。