來自 《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 鏈接類似如下樣子:
我們猜想這個應該就是搜狗圖片存放圖片鏈接的 url,因此我們來解析一下。首先看 category 和 tag 后面那一串應該是字符的編碼,查了下 %E5%A3%81%E7%BA%B8 是“壁紙” 的編碼,而 %E5%85%A8%E9%83% 是 “全部” 的編碼,所以說,上面的鏈接和如下的鏈接是等效的:
網頁打開如下圖所示:
此外,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 動態抓取圖片庫中圖片的詳解,希望能幫助大家理解。