iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

前幾天介紹了requests、beautifulsoup,今天來介紹selenium,那什麼是selenium呢?

其實也是一爬蟲工具,與requests不同的是,requests屬於「靜態爬蟲」,selenium屬於「動態爬蟲」,顧名思義,requests只能爬網站固定的資訊,但凡屬於javascript這種在客戶端才處理的資訊,requests是無法處理的,這時才有了selenium來輔助我們爬蟲。

但它也是缺點的,例如,requests只需要取的html的資訊,速度非常快,selenium則需要等javascript渲染完成後才可能執行下一步。

如果還是聽不懂,以下由我來demo給大家看。

下載Webdriver

依照你的瀏覽器是哪一家的,像我是用Brave,是Chromium base的瀏覽器,所以要去下載Chromedriver。

來到設定->關於可以看到你的瀏覽器版本

https://ithelp.ithome.com.tw/upload/images/20230929/20146555YAaPgiydOI.png

再來來到Chromedriver 下載頁面依照你的版本去下載對應的版本,假如都更新到最新的版本,那Chromedriver選擇最新的版本就好了。

依照你的作業系統載對應的版本

https://ithelp.ithome.com.tw/upload/images/20230929/20146555X1u0XcAhBJ.png

再解壓webdriver到你放程式的目錄下就可以

以2023/7/31網頁資訊為結果
以爬4Gamers網頁作範例,如果以reqeusts去爬蟲...

import requests
from bs4 import BeautifulSoup

url = "https://www.4gamers.com.tw/"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}

response = requests.get(url, headers=headers)
result = BeautifulSoup(response.text, 'html.parser')

element = result.find_all('img', class_='w-100 h-auto flex-grow-1 object-cover')
print(element)

#output
[]
執行時間:0.240760 秒

用同樣的篩選條件使用selenium的結果

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

start  = time.time()
driver = webdriver.Chrome()
driver.get('https://www.4gamers.com.tw/')
print(driver.find_element(By.CSS_SELECTOR, 'img[class="w-100 h-auto flex-grow-1 object-cover"]').get_attribute('src'))

end  = time.time()
print("執行時間:%f 秒" % (end - start))
#output
https://img.4gamers.com.tw/news-image/817bbd4f-b76d-4f33-916a-95b90ae03930.jpg
執行時間:4.356299 秒

可以看的出來selenium需要等網站渲染完成後,才能取得網站資訊,相比requests雖然什麼資訊都沒有,但執行速度很快,那如何使用就全看使用者如何使用。


搜尋網頁元素

selenium篩選網站元素分為以下幾種

方法
By.ID
By.NAME
By.XPATH
By.LINK_TEXT
By.PARTITAL_LINK_TEXT
By.TAG_NAME
By.CLASS_NAME
By.CSS_SELECTOR

以巴哈姆特動漫瘋為舉例,對每個不同的條件做搜尋

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://ani.gamer.com.tw/')
print("ID:", driver.find_element(By.ID, 'anime-search-sky').tag_name)
print("NAME:", driver.find_element(By.NAME, 'keyword').tag_name)
print("XPATH:", driver.find_element(By.XPATH, '/html/body/div[3]/div[2]/div[1]/p[2]/a[2]').text)
print("LINK_TEXT:", driver.find_element(By.LINK_TEXT, '合作提案').tag_name)
print("PARTIAL_LINK_TEXT:", driver.find_element(By.PARTIAL_LINK_TEXT, '合作').tag_name)
print("TAG_NAME:", driver.find_element(By.TAG_NAME, 'a').tag_name)
print("CLASS_NAME:", driver.find_element(By.CLASS_NAME, 'icon').tag_name)
print("CSS_SELECTOR:", driver.find_element(By.CSS_SELECTOR, 'a[href="https://user.gamer.com.tw/help/tellus.php?c1=3"]').tag_name)

#output
# ID: input
# NAME: input
# XPATH: 合作提案
# LINK_TEXT: a
# PARTIAL_LINK_TEXT: a
# TAG_NAME: a
# CLASS_NAME: img
# CSS_SELECTOR: a

參考資料

https://officeguide.cc/python-measure-execution-time-tutorial-examples/


上一篇
[Day 18] 初見Beautifulsoup
下一篇
[Day 20] 初見selenium(下)
系列文
用30天打好Python、LineBot的基礎&基本應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言