6步驟教你輕鬆爬unsplash圖片
前言:
在這個大數據時代裡,AI是一個重要的工具,然而在製作出一個好的AI模型就需要有足夠的數據,而在影像辨識領域也是如此,因此本文將介紹如何在colab上使用python 的selenium 爬取unsplash裡的免費照片,並自動下載到google雲端硬碟中。
本文:
話不囉說先上程式碼
#安裝相關套件
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium
!pip install wget
#colab運行selenium 所需指令
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)
driver.implicitly_wait(10)
#載入selenium相關模組,用於等待網頁載入
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os #用於取得及創建google雲端硬碟之資料夾或路徑
import wget #wget模組用於下載
#連接google雲端硬碟
from google.colab import drive
drive.mount('/content/drive')
driver.get("https://unsplash.com/images")
# 最大化窗口,因為每一次爬取只能看到視窗内的圖片
driver.maximize_window()
from selenium.webdriver.common.by import By
q = driver.find_element(By.NAME, 'searchKeyword')#找到搜尋欄之標籤
keyword='cat'#要搜尋的關鍵字
q.send_keys(keyword)#在搜尋欄之標籤輸入要搜尋的關鍵字
q.submit()#送出搜尋關鍵字
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'AYOsT'))
)#等待網頁載入"load more"按鈕
button = driver.find_element(By.CLASS_NAME, 'AYOsT')#找到"load more"按鈕之標籤
button.click()#點擊
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'YVj9w'))
)#等待網頁載入圖片
imgs = driver.find_elements(By.CLASS_NAME,'YVj9w')#找到圖片之標籤並存入imgs變數
path='/content/drive/My Drive/test'+'/'+keyword #建立路徑字串
if not os.path.exists(path):#判斷google雲端硬碟是否存在該路徑
os.mkdir(path)#建立前面所建立的路徑資料夾
count = 0
for img in imgs:
save_img = os.path.join(path,keyword+str(count)+'.jpg')#將路徑字串再加上圖片的檔名作為存檔位置
#print(img.get_attribute("src"))
try:#使用try 及 except 是為了解決當imgs圖片取完,而save_img持續增加所產生的錯誤
wget.download(img.get_attribute("src"),save_img)#由imgs中取得之圖片網址下載照片,並存入存檔位置路徑
count += 1
except:
break
else:#如果路徑存在則不下載圖片,並印出folder exist文字
print("folder exist")#印出folder exist文字
步驟1.先在colab中安裝相關套件,並載入相關模組
步驟2.找出搜尋欄之屬性並定位
進入unsplash網頁中並按右鍵選擇檢查(或按F12也可以),如下圖所示,會出現一堆程式碼的頁面,接著要知道unsplash輸入的欄位,可以如下圖先點擊紅色圈選處之圖示,接著點擊搜尋欄就可以看到搜尋欄的相關屬性。
觀察上圖可以看到搜尋欄位的name叫做searchKeyword,因此程式碼中之
q = driver.find_element(By.NAME, ‘searchKeyword’)就是將q變數指定成搜尋欄位,接著就可以做出輸入輸入關鍵字以及送出關鍵字搜尋。
步驟3.找出圖片之共同資訊並取得
從步驟2進入搜尋結果後如下圖所示,接著使用步驟2的方法找出圖片在網頁上的屬性資料比對過好幾個圖片後,可以發現每一張圖片的class=”YVj9w”,因此程式碼中之imgs = driver.find_elements(By.CLASS_NAME,’YVj9w’)就是要找網頁中的圖片。
步驟4.點擊Load more photos按鈕載入更多
在搜尋照片時可以發現unsplash只會顯示部分照片,若想要看更多照片就必須要點擊Load more photos按鈕才會載入更多(如下圖所示),因此要爬照片也需要點擊此按鈕,
經過前面的步驟相信大家應該知道首先要先找出Load more photos按鈕的相關屬性,並確認如何才能定位到按鈕,
由上圖中可以看到,按鈕只有class屬性,因此可以選擇class屬性來定位,但與步驟3不同的是步驟3中的class只有單一字串並無空格,而在html中這代表著一個元素有多個class的屬性名稱[1],因此如果直接串名子放入driver.find_elements(By.CLASS_NAME,”)中搜尋會報錯。
解決方法為先在網頁內碼中搜尋各個class的屬性名稱,搜尋後可以發現’AYOsT’只有1個因此就可以使用driver.find_element(By.CLASS_NAME, ‘AYOsT’)進行定位,並點擊載入更多圖片。
步驟5.使用wget模組進行圖片之下載
接著使用迴圈的方式再加上get_attribute取得圖片的連結,最後可以看到程式碼中之wget.download(img.get_attribute(“src”),save_img)就是使用wget下載圖片並儲存至google雲端硬碟