python爬取unsplash桌布
阿新 • • 發佈:2019-01-08
感覺還不錯,就試著爬一下,雖然並沒有什麼意義,因為桌布有一張就好了,沒必要爬好多。
分析頁面:
頁面中有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)
成果:
由於硬碟數量有限,就爬了一點。
希望大家共同交流,不當之處還請指出,謝謝!