來自 《Python項目案例開發從入門到實戰》(清華大學出版社 鄭秋生 夏敏捷主編)中爬蟲應用——抓取百度圖片python
本文爬取了搜狗圖片庫中的圖片,相對於爬取特定網頁中的圖片,爬取圖片庫中的圖片相對複雜一些,複雜的緣由主要在於圖片的動態加載上。正則表達式
圖片庫中的圖片太多,因此訪問網頁的時候不是一次性把圖片所有加載出來,而是根據鼠標滾輪的行爲進行動態加載。這會致使和以前的抓取特定網頁中的圖片有所區別,主要就是沒辦法經過以前查看網頁源代碼的方法直接獲得存放圖片的連接,而是須要在 Network 中的 XHR 下的 Headers 和 Preview 找到圖片存放網址的規律。chrome
不用着急,後續會慢慢詳解。首先,我先貼出代碼:json
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標籤篩選的方法都只會返回一張搜狗的圖標圖片,其餘顯示的咱們想要下載的圖片是看不到。jsp
(2)咱們要找到咱們想要下載的圖片,就必須點擊 Network, 選擇 XHR,而後就會看到在 Name 欄出現了getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA 的內容, 你用鼠標越往下加載圖片,這個getAllRecomPicByTag的內容就會出現越多,你點擊它,能夠看到出現的就是存放圖片地址的 API 。編碼
這裏,你能夠點擊Preview,觀察這個 json 數組,一層層的打開all_items 就能夠看到裏面存放的就是圖片的地址,想明白了這就是咱們能夠找到圖片連接的地方,那麼就能夠肯定咱們想要找的圖片連接就在 Headers 中。url
(3)點擊 Headers 就能夠找到它們所對應的 url 連接。spa
這個Request URL 連接相似以下樣子:code
咱們猜測這個應該就是搜狗圖片存放圖片連接的 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 動態抓取圖片庫中圖片的詳解,但願能幫助你們理解。