1. 程式人生 > >python爬取unsplash桌布

python爬取unsplash桌布

感覺還不錯,就試著爬一下,雖然並沒有什麼意義,因為桌布有一張就好了,沒必要爬好多。

分析頁面:

頁面中有search這個視窗,搜尋一次發現url的格式,這樣就可以構造任何想下載型別的桌布了。


審查元素髮現每張照片都有自己獨特的id

而且下載連結格式為

https://unsplash.com/photos/'+id+'/download


就開始用正則表示式來提取圖片id,用固定格式來下載。

但是在使用過程中發現這樣只能搜尋到10個圖片id,也就是隻能下載10張圖片,這樣爬蟲顯得就毫無意義了。

為什麼搜尋結果那麼多,然而只能正則找到10個圖片呢?

因為這個頁面使用了動態載入,在使用者下拉到一定位置觸發js的一個事件,來獲取下面照片的資訊。

在控制檯可以看到下拉的時候傳送的資料:



url解碼看看。


發現也是具有固定格式的,而且每一頁包含20張圖片,page=x ,這個x是遞增的。

進入url發現這裡面同樣有圖片id:


這樣就可以每次請求這個url,通過變換page=來得到每頁的圖片id,再通過下載url進行下載。

寫程式碼。

import requests
import re,os
import time,random
def tupian(leixing):
    page=1                 #初始page=1
    i=1                    #記錄圖片個數
    while True:           #爬到地老天荒
        url = 'https://unsplash.com/napi/search/photos?query='+leixing+'&xp=&per_page=20&page='+str(page)
        r = requests.get(url)        #獲取網頁程式碼
        r.headers={
    'Pragma' : 'no-cache',
    'Cache-Control' : 'no-cache',
    'Upgrade-Insecure-Requests' : '1',
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36',
    'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language' : 'zh-CN,zh;q=0.9',
    'Connection' : 'close',
}              #設定requests的一些特徵,防止反爬蟲機制
        #print(r.text)
        key = '\"download\":\"https://unsplash.com/photos/(.*?)/download\"'  #下載圖片的固定url
        c = re.findall(key,r.text, re.S)        #提取圖片id
        # print(c)
        for id in c:                
            time.sleep(random.uniform(0,1))                #為了儘量友好,設定超時時間
            if i%10==0:                                    #也是為了友好。
                time.sleep(10)
            try:
                fp=open('E:\\圖片\\'+leixing+"\\"+id+'.jpg',"wb")               #開啟檔案
            except:
                os.makedirs('E:\\圖片\\' + leixing + "\\")            #沒有此資料夾的話,新建資料夾
            print("正在下載第{}張圖片".format(i))
            d = requests.get('https://unsplash.com/photos/'+id+'/download')        #獲取圖片資料
            try:
                fp.write(d.content)         #將資料寫入檔案
                fp.close()                  
                print("完成!")
            except:
                print("無法連線!")
                continue
            page = page + 1             #page數量變換達到重複爬取的目的
            i = i + 1                   #爬取數量計數
leixing=input("輸入你想要的圖片型別:") #輸入圖片型別
tupian(leixing)

成果:

由於硬碟數量有限,就爬了一點。

希望大家共同交流,不當之處還請指出,謝謝!