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

蘇靖軒 Jenson
企鵝也懂程式設計
6 min readAug 15, 2019

在做資料分析、訓練model時,常常需要大量的資料來幫助建模,如何自動化又快速的搜集大量資料也至關重要。

Python已經有許多好用的爬蟲工具,如常見方法是使用urllib或是requests去請求網站,得到網站的html結構,再使用BeautifulSoup或是pyquery去解析網頁的結構,把資料抽取出來。另外還有很多優秀的框架,像是pyspiderscrapy等等

這篇文章使用Python常用的自動化工具 — Selenium,來幫助我們爬取圖片!

過去用requests+BeautifulSoup遇到的問題

現在主流的圖片搜尋引擎大部分都採用inifinite scroll的方式去加載圖片(捲軸拉到至底才會再加載新圖片)

捲軸拉到底才會加載新圖片

而inifinite scroll都是由Javascript去控制的,因此我們使用requests去請求圖片的網址時,只會請求到一開始加載頁面的圖片量,還有大量的圖片爬取不到

順手附上程式碼

import requests
from bs4 import BeautifulSoup
img_name = '柯基'
url = 'https://www.google.com.tw/search?q='+img_name+'&tbm=isch'
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'lxml')
print(soup.prettify())

為了解決inifinite scroll的問題,因此我們決定出動Selenium來自動幫助我們控制捲軸來爬取圖片

選擇要爬取的圖片網站

因爲Google對於大量請求很敏感,設置了反爬蟲系統,被偵測到的話以後就不能使用Google搜尋,大家一定要特別小心,至於怎麼防止被偵測,通常可以簡單採用一些方式,詳細的又是另一個故事了

  1. 使用sleep方法,減緩請求速度
  2. 使用浮動ip來連網

因此我們這裡選擇搜狗圖片作為我們要爬蟲的網頁,一方面圖片資源也很多,再來就算真的被封鎖ip也比較不心痛(?)

準備爬蟲環境

  1. 首先先安裝Selenium
pip install selenium

2. 下載Webdriver

WebDriver是用來執行並操作瀏覽器的一個API介面,程式可以透過WebDriver來控制瀏覽器。Webdriver也包括 Chrome,Safari,Firefox 等主流的瀏覽器,這裡用chromedriver作為示範

首先我們先查看目前電腦裡的chrome瀏覽器是什麼版本,需要下載對應版本的webdriver

著手開始爬蟲!

因為我最喜歡科基了,所以就用爬取科基圖片當作示範

  1. 搜狗圖片的科基網址

先在搜狗圖片打上”柯基”,用這串網址作為等一下要爬取的網址上Selenium程式碼

2. Selenium程式碼

from selenium import webdriver
import time
import urllib
import os
# 存圖位置
local_path = 'imgs'
# 爬取頁面網址
url = 'http://pic.sogou.com/pics?ie=utf8&p=40230504&interV=kKIOkrELjboMmLkElbkTkKIMkbELjbgQmLkElbcTkKILmrELjb8TkKIKmrELjbkI_65458625&query=%E6%9F%AF%E5%9F%BA&'

# 目標元素的xpath
xpath = '//div[@id="imgid"]/ul/li/a/img'
# 啟動chrome瀏覽器
chromeDriver = r'/Users/music1353/webDriverTool/chromedriver' # chromedriver檔案放的位置
driver = webdriver.Chrome(chromeDriver)

# 最大化窗口,因為每一次爬取只能看到視窗内的圖片
driver.maximize_window()

# 紀錄下載過的圖片網址,避免重複下載
img_url_dic = {}

# 瀏覽器打開爬取頁面
driver.get(url)

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

for element in driver.find_elements_by_xpath(xpath):
try:
img_url = element.get_attribute('src')

# 保存圖片到指定路徑
if img_url != None and not img_url in img_url_dic:
img_url_dic[img_url] = ''
m += 1
# print(img_url)
ext = img_url.split('/')[-1]
# print(ext)
filename = str(m) + 'kerGee' + '_' + ext +'.jpg'
print(filename)

# 保存圖片
urllib.request.urlretrieve(img_url, os.path.join(local_path , filename))

except OSError:
print('發生OSError!')
print(pos)
break;

driver.close()

執行這段程式碼,就會自動開啟一個由selenium控制的瀏覽器,自動下載圖片到資料夾

資料夾就會有柯基大量發生!!!

這樣就表示成功使用Selenium爬取大量圖片了!

--

--

蘇靖軒 Jenson
企鵝也懂程式設計

鵝肝前端佐後端風味醬汁,少許資料分析點綴,人生的擺盤,done