|

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雲端硬碟

步驟6.完成

參考資料:

[1]seleniunm定位className有空格-程式人生

Similar Posts