|

6步驟教你快速爬取Google圖片

前言:

在這個大數據時代裡,AI是一個重要的工具,然而在製作出一個好的AI模型就需要有足夠的數據,而在影像辨識領域也是如此,而先前筆者已介紹如何將unsplash的免費圖片下載並儲存於雲端硬碟中,但應該有人想知道如何下載google圖片至雲端硬碟中,因此本文將介紹如何在colab上使用python 的selenium 爬取google圖片,並自動下載到google雲端硬碟中。

本文:

!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium
!pip install python-datauri

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)

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
from google.colab import drive
drive.mount('/content/drive')

driver.get("https://www.google.com.tw/imghp?hl=zh-TW&authuser=0&ogbl")
# 最大化窗口,因為每一次爬取只能看到視窗内的圖片  
driver.maximize_window()
# 紀錄下載過的圖片網址,避免重複下載  
img_url_dic = {}
from selenium.webdriver.common.by import By
q = driver.find_element(By.NAME, 'q')
keyword='dog'
q.send_keys(keyword)
q.submit()

import urllib
import time

# 模擬滾動視窗瀏覽更多圖片
pos = 0  
count = 0 # 圖片編號 
for i in range(10):  
    pos += i*500 # 每次下滾500  
    js = "document.documentElement.scrollTop=%d" % pos  
    driver.execute_script(js)  
    time.sleep(1)

    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'Q4LuWd'))
    )
    imgs = driver.find_elements(By.CLASS_NAME,'Q4LuWd')


    path='/content/drive/My Drive/test/google_photo'+'/'+keyword #建立路徑字串
    if not os.path.exists(path):
      os.mkdir(path)

    for img in imgs:

      img_url=img.get_attribute("src")
      if img_url != None and not img_url in img_url_dic:
        img_url_dic[img_url] = ''
        count += 1
        save_img = os.path.join(path,keyword+str(count)+'.jpg')
        #圖片之開啟並儲存
        with urllib.request.urlopen(img.get_attribute("src")) as response:
          data = response.read()
        with open(save_img, "wb") as f:
          f.write(data)
            
driver.close() 

步驟1.先在colab中安裝相關套件,並載入相關模組

步驟2.找出搜尋欄之屬性並定位

進入google圖片搜尋頁中並按右鍵選擇檢查(或按F12也可以),如下圖所示,會出現一堆程式碼的頁面,接著要知道google圖片搜尋輸入的欄位,可以如下圖先點擊紅色圈選處之圖示,接著點擊搜尋欄就可以看到搜尋欄的相關屬性。

觀察上圖可以看到搜尋欄位的name叫做q,因此程式碼中之

q = driver.find_element(By.NAME, ‘q’)就是將q變數指定成搜尋欄位,接著就可以做出輸入輸入關鍵字以及送出關鍵字搜尋。

步驟3.找出圖片之共同資訊並取得

從步驟2進入搜尋結果後如下圖所示,接著使用步驟2的方法找出圖片在網頁上的屬性資料比對過好幾個圖片後,可以發現每一張圖片的class=”rg_i Q4LuWd”,而這個class有2個名稱以空格分開,這在html中這代表著一個元素有多個class的屬性名稱[1],因此在網頁內碼中搜尋各個class的屬性名稱,搜尋後可以發現”Q4LuWd”只用於圖片,因此程式碼中之imgs = driver.find_elements(By.CLASS_NAME,’Q4LuWd’)就是要找網頁中的圖片。

步驟4.透過模擬滾動瀏覽器載入更多圖片

所使用之指令如下,並寫成迴圈(此處之指令參考[2]),即可模擬網頁滾動之操作並寫成迴圈後就能將每次滾動後之頁面圖片下載,並將已下載之圖片網址儲存至img_url_dic中,避免重複下載(此處指令參考[2])

    pos += i*500 # 每次下滾500

    js = “document.documentElement.scrollTop=%d” % pos  

    driver.execute_script(js)  

步驟5.使用urllib模組進行圖片之下載

使用迴圈的方式再加上get_attribute取得圖片的連結後,可以看到圖片的連結是以dataurl的方式儲存,因此無法像另一篇文章使用wget的方式取得並下載照片,因此改為使用urllib模組進行圖片之下載,所使用之指令如下

用於開啟dataurl圖片

with urllib.request.urlopen(img.get_attribute(“src”)) as response:

data = response.read()

用於將圖片儲存於google雲端硬碟

with open(save_img, “wb”) as f:

     f.write(data)

步驟6.完成

參考資料:

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

[2][Python爬蟲] Python Selenium 自動化爬取大量圖片

Similar Posts