WebDriver Manager + Selenium: หมดปัญหาไดรเวอร์ไม่ตรงเวอร์ชั่น!?
เฮ้ย พวก,
ถ้าใครเคยเขียน Selenium เนี่ยนะ คงรู้ดีเลยว่าการมานั่ง manage web driver เนี่ยมันโคตรปวดหัว! ต้องไปดูเวอร์ชั่น Chrome ของเรา, แล้วไปหา driver ที่ตรงกันเป๊ะๆ, โหลดมา, วางไว้ที่ path ที่ถูกต้อง... โคตรน่าเบื่อเลยจริงดิ? ยิ่งถ้า Chrome มันอัปเดตบ่อยๆ นี่คือร้องไห้เลยนะ โค้ดที่เคยรันได้อยู่ดีๆ ก็พังเฉยๆ เพราะ driver ไม่ตรงเวอร์ชั่น.
แต่โชคดีที่โลกนี้มีฮีโร่เว้ย! นั่นก็คือ webdriver_manager
ไอ้เจ้าตัวนี้มันจะจัดการเรื่องดาวน์โหลด driver ให้เราเองแบบอัตโนมัติเลย สะดวกโคตรๆ แค่เรียกใช้ มันก็ไปเช็คเวอร์ชั่นเบราว์เซอร์เรา แล้วก็โหลดตัวที่ใช่มาให้เลย ไม่ต้องทำอะไรเองอีกต่อไป.
มาดูกันว่าใช้งานยังไงบ้างนะ
อันดับแรก, ก็ pip install สองตัวนี้ซะก่อนเลยนะ:
pip install selenium webdriver-manager
พอติดตั้งเสร็จแล้ว ก็มาลองเขียนโค้ดง่ายๆ ดูกันเลย:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
print("กำลังเปิดเบราว์เซอร์... ")
# นี่แหละ หัวใจสำคัญเลยนะ! มันจะเช็คให้เองว่า Chrome เราเวอร์ชั่นไหน
# แล้วก็ไปโหลด driver ที่เข้ากันมาให้เลย ถ้ายังไม่มี
# โค้ดบรรทัดนี้เนี่ย ช่วยชีวิตได้เยอะมากๆ
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
print("เปิดได้แล้ว! ลองเข้า google ดู")
driver.get("https://www.google.com")
print(f"อยู่หน้า: {driver.title}")
# ลองหา input search box แล้วพิมพ์อะไรหน่อย
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Python Selenium Webdriver Manager")
search_box.submit()
print("รอผลลัพธ์แป๊บนะ...")
# รอให้ผลลัพธ์ขึ้นมา เพื่อให้มั่นใจว่าโหลดเสร็จก่อนที่เราจะไปหา element อื่นๆ
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "search"))
)
print("เห็นผลลัพธ์แล้ว!")
# driver.quit() # ปิดเบราว์เซอร์เมื่อเสร็จงาน
# print("ปิดเบราว์เซอร์ละ")
เป็นไง? โคตรง่ายเลยใช่ป่ะ? ไม่ต้องมานั่งระบุ executable_path ให้วุ่นวายอีกแล้ว
คราวนี้ มาลองโค้ดที่จริงจังขึ้นมาอีกหน่อยนะ ลองเอาไปใช้สแครปเว็บอะไรเล็กๆ น้อยๆ ได้เลย สมมติว่าเราจะลองสแครปชื่อบทความจากหน้า blog ง่ายๆ ของตัวเอง:
# อันนี้โค้ดจริงจังขึ้นมาอีกหน่อย ลองเอาไปใช้สแครปเว็บอะไรเล็กๆ น้อยๆ ได้เลย
# สมมติเราจะลองสแครปชื่อบทความจากหน้า blog ง่ายๆ ของตัวเอง
print("\n--- เริ่มสแครปบทความ ---")
driver.get("https://cii3.net/blogs") # สมมติว่ามีหน้า blogs ในเว็บ cii3.net
try:
# รอให้ element ที่มีบทความมันโผล่มานะ
# อาจจะต้องดู selector ที่ถูกต้องของเว็บนั้นๆ ด้วยนะ อันนี้แค่ตัวอย่าง
WebDriverWait(driver, 15).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "h2.blog-post-title a"))
)
titles = driver.find_elements(By.CSS_SELECTOR, "h2.blog-post-title a")
print(f"เจอ {len(titles)} บทความ:")
for i, title in enumerate(titles):
print(f"- {i+1}. {title.text}")
except Exception as e:
print(f"เอ้า! มีปัญหาตอนสแครปว่ะ: {e}")
# นี่ไง! error ที่โคตรจะเจอประจำเวลาเขียน Selenium
# ถ้าเจอพวก TimeoutException หรือ NoSuchElementException บ่อยๆ นะ
# ลองเช็ค selector ดีๆ นะ แล้วก็ลองเพิ่มเวลาใน WebDriverWait ดู
# บางทีเว็บมันโหลด dynamic content ช้ากว่าที่เราคิดเยอะเลย หรือไม่ก็ selector เราพลาดเองเลย
print("\nปกติแล้วถ้าเจอ Error พวกนี้ (TimeoutException, NoSuchElementException) นะ")
print("มันมักจะเกิดจาก:")
print("1. Selector ผิด: ไป Inspect Element ดูดีๆ ว่าที่เราเขียน 'h2.blog-post-title a' มันถูกจริงๆ หรือเปล่า? อันนี้พลาดบ่อยสุดๆ")
print("2. เว็บโหลดช้า: ลองเพิ่ม `WebDriverWait` จาก 15 เป็น 30 หรือมากกว่านั้นดู มันช่วยได้เยอะนะ")
print("3. Element ยังไม่พร้อม: บางที element มันโผล่มาแต่ยังคลิกไม่ได้, ต้องใช้ `element_to_be_clickable` แทน `presence_of_element_located` ลองหาข้อมูลเพิ่มดูนะ")
print("4. โดนบล็อก: บางเว็บอาจจะตรวจจับได้ว่าเราใช้ bot แล้วบล็อก IP เราเลยก็มีนะ อันนี้ต้องลองหา proxy หรือใช้ headless mode ดีๆ หรือไม่ก็ลดความถี่ในการ request")
finally:
driver.quit()
print("\nจบการทำงาน! ปิดเบราว์เซอร์เรียบร้อย.")
ความคิดเห็นส่วนตัว:
ส่วนตัวคือเลิฟ webdriver_manager มากๆ ครับ เพราะมันช่วยให้ชีวิต Selenium dev ง่ายขึ้นเยอะเลย ไม่ต้องมาเสียเวลาแก้เรื่อง driver เวอร์ชั่นไม่ตรงอีกต่อไปแล้ว. ใครที่ยังโหลด driver เองอยู่ ไปลองใช้ดูนะ ไม่ผิดหวังแน่นอน เชื่อดิ! การจัดการ driver แบบ auto นี่แหละคือทางออกที่ดีที่สุดแล้วสำหรับงาน automation หรือ scraping ด้วย Selenium. ใครใช้แล้วติดปัญหาอะไร ก็คอมเมนต์มาคุยกันได้นะ! ยินดีช่วยเท่าที่ทำได้เลย.