top of page

สร้างบอทกดเวป ใน 10 คำสั่ง Python Web Automation ด้วย Selenium | ลดงานด้วย Python

Updated: Oct 26, 2022

เขียนคำสั่งสั่งงานการทำงานบนเวปไซต์ และโปรแกรมเปิดบน browser สร้างเป็นระบบทำงานอัตโนมัติ ทำได้ใช้ไม่ถึง 10 คำสั่ง! พร้อมตัวอย่าง เรียนกับ Ultimate Python ในซีรี่ย์ ลดงานด้วย Python


เรียนในบทเรียนรวิดีโอผ่าน Youtube

ไปยังปรแกรมตัวอย่างในคลาส


ข้อแก้ไข

  1. Selenium มีการอัพเดท version ในการติดตั้ง ให้ใช้คำสั่ง !pip install selenium==3.141.0

  2. ในมีการกล่าวถึง Syntax ซึ่งเป็นข้อผิดพลาด และที่จริงต้องการหมายถึง HTML Tags

  3. เวปไซต์ของ SET มีการปรับปรุงใหม่ สามารถดูเครื่องมือเป็นตัวอย่าง และหลักการได้ แต่อาจมีข้อแตกต่างบ้าง


สิ่งที่เราทำบนเวปไซต์

หากลองศึกษาสิ่งที่เราทำบนเวปไซต์แล้วจะพบว่าจริงๆ แล้วการทำงานกับเวปไซต์มีแค่ไม่กี่อย่างเท่านั้น เช่น การคลิก และการพิมพ์ข้อมูล แต่ความแตกต่างของแต่ละเวปไซต์ คือ การที่มีส่วนประกอบไม่เหมือนกัน

ดังนั้นหลักการที่สำคัญขงอการทำงานบนเวปไซต์แท้จริงแล้ว คือ การระบุตำแหน่งบนหน้าเวปไซต์ที่เราต้องการจะคลิก หรือพิมพ์ข้อความใส่ ซึ่งเป็นหลักการที่เราจะได้ทดลองทำกับโปรแกรมตัวอย่างในวันนี้

การทำงานกับข้อมูลเวปไซต์

ข้อมูลที่เราเห็นบนเวปไซต์เป็นผลลัพธ์ของโค้ด HTML ที่ไปดึงข้อมูลต่างๆ มาจัดเรียงให้สวยงามตามที่ตาเราเห็น โดย Browser จะทำความเข้าใจโค้ด HTML และเข้าไปดึงข้อความ รูป วิดีโอ หรือข้อมูลอื่นๆ ตามที่ HTML ตัวนั้นระบุจากอินเตอร์เน็ต และตีความออกมาเป็นหน้าเวปที่สวยงาม

โค้ด HTML จะประกอบไปด้วยส่วนย่อยที่เรียกว่า HTML Tags ที่แบ่งส่วนการรับผิดชอบการแสดงผลของหน้าเวปแต่ละส่วนโดยมีลักษณะที่ซ้อนกันลงไปเป็นชั้นๆ เช่น HTML Tags ที่รับผิดชอบหน้าเวปทั้งหมด จะประกอบไปด้วย HTML Tags ที่รับผิดชอบหน้าเวปด้านบน และ HTML Tags ที่รับผิดชอบแถบโฆษณาด้านล่าง เป็นต้น

หลักการสำคัญของการทำงานกับข้อมูลหน้าเวปในคลิปนี้ คือ การระบุ HTML Tags ที่เหมาะสมเพื่อการดึงข้อมูลที่เราต้องการ ให้สามารถดึงข้อมูลที่เกิดซ้ำๆ ได้อย่างมีประสิทธิภาพ โดยผ่านการระบุ ชื่อ และ Attribute

สำหรับ Chrome เราสามารถดูโค้ด HTML ของเวปใดๆ ได้โดยการกด F12 (ในการเรียนรู้ในคลิปนี้แนะนำให้ติดตั้ง Chrome)

ตัวอย่างโปรแกรมลดงาน

ในตัวอย่างจะเป็นการสร้างโปรแกรมจาก 0 เพื่อดาวน์โหลดรายงานงบการเงินของบริษัทใน SET50 หรือ 50 บริษัทที่มีมูลค่าสูงสุดในตลาด ที่อยู่ใน หน้าเวปนี้ ให้ครบทุกบริษัทแบบอัตโนมัติ

ขั้นตอนการทำงานคร่าวๆ ของโปรแกรม

  1. ดึงลิ้งค์ของทุกเวปไซต์ใน SET50

  2. นำลิ้งค์ไปเปิดเข้าเวปบริษัท

  3. คลิกเข้าตามขั้นตอนจนถึงการดาวน์โหลด

  4. ทำซ้ำจนดาวน์โหลดไฟล์ครบของทุกบริษัท

การใช้งานโปรแกรมตัวอย่าง

ไปยังปรแกรมตัวอย่างในคลาส


สำหรับโปรแกรมตัวอย่าง จะต้องทำการดาวน์โหลดไฟล์คำสั่งจากลิ้งค์ด้านบน และทำการเปิดไฟล์คำสั่งผ่านโปรแกรม Anaconda / Jupyter Notebook เพื่อใช้งานบนคอมพิวเตอร์ จะง่ายที่สุด

หากต้องการทดลองใช้งานให้กด / คลิกที่สัญลักษณ์ In [ ] สีน้ำเงินด้านซ้ายของหน้ากระดาษนี้ และกดปุ่ม Run ตามด้านล่าง ทำซ้ำจนครบทุกอัน โดยจะต้องทำตามลำดับจากอันด้านบนลงไปด้านล่างของกระดาษ

หากต้องการดูโฟลเดอร์ของไฟล์ Jupyter Notebook นี้ให้กดที่ File >> Open แล้วโฟลเดอร์ที่ไฟล์ Jupyter Notebook นี้อยู่จะถูกเปิดขึ้น

ติดตั้ง selenium

สำหรับการทำงานของคำสั่ง selenium เพื่อควบคุมเวปไซต์ เราจะต้องมีการติดตั้ง chromedriver ที่มีเวอร์ชันตรงกับ chrome ที่มีอยู่บนคอมพิวเตอร์ และยังต้องการ library ที่ชื่อว่า selenium ติดตั้งไว้เรียกใช้ตามคำสั่งด้านล่างนี้


ติดตั้งเครื่องมือ

In [ ]:
!pip install selenium==3.141.0


นำคำสั่งมาใช้งาน

สำหรับคำสั่งที่จะใช้จริงๆ คือ คำสั่ง webdriver ที่จะนำมาจาก library selenium ดังนั้นจะขอนำมาใช้เพียงแค่ webdriver เท่านั้น


นำเข้าเครื่องมือ

In [ ]:
from selenium import webdriver

เก็บลิ้งค์เวปของทุกบริษัท

ในการเข้าไปทำงานกับข้อมูลของทุกบริษัท ก่อนอื่นเราจะต้องระบุก่อนว่าข้อมูล "ทุกบริษัท" อยู่ที่ไหน นั่นคือการเก็บข้อมูลลิ้งค์ที่เข้าถึงแต่ละบริษัทเพื่อนำมาใช้เข้าไปยังหน้าข้อมูลอีกที


โดยมีขั้นตอนการทำงานเบื้องต้นดังนี้
  1. เปิดเวปไซต์ที่มีลิ้งค์ของทุกบริษัทให้เก็บ

  2. ระบุตำแหน่งของ tag ที่เก็บข้อมูลลิ้งค์เอาไว้ (ในตัวอย่างใช้วิธีการระบุ xpath) และคัดเลือกเฉพาะข้อมูลที่ต้องการ

  3. นำข้อมูลที่เจอจากการะบุตำแหน่งทีละตัวมาทำซ้ำด้วย for loop

  4. ดึงลิ้งค์จาก tag ที่ดึงมาได้

  5. เก็บข้อมูลเอาไว้ใน list เพื่อนำไปใช้งานต่อ

In [ ]:
company_list = []
driver = webdriver.Chrome()
driver.get('https://marketdata.set.or.th/mkt/sectorquotation.do?sector=SET50&language=th&country=TH')
for data in driver.find_elements_by_xpath('//table[@class="table-info"]//tbody//tr//td[@style="text-align: left;"]//a')[8:]:
 company_list.append(data.get_attribute('href'))

คลิกตามขั้นตอนเพื่อดาวน์โหลดไฟล์

สำหรับบอทในตัวอย่าง จะเป็นการกดเข้าไปที่ส่วนของข้อมูล และกดลิ้งค์เพื่อดาวน์โหลดข้อมูล


โดยมีขั้นตอนการทำงานเบื้องต้นดังนี้
  1. นำลิ้งค์แต่ละลิ้งค์ออกจาก list

  2. นำลิ้งค์มาเปิดเวปไซต์ที่เก็บข้อมูล

  3. ระบุตำแหน่งส่วนข้อมูลที่ต้องการคลิก

  4. ส่งคำสั่งคลิก

  5. ระบุตำแหน่ง ส่งคำสั่งคลิก ทำซ้ำจนได้การคลิกข้อมูลที่ต้องการ

  6. ทำซ้ำให้ครบทุกบริษัทด้วย for loop

In [ ]:
for company in company_list:
 driver.get(company)
 driver.find_elements_by_xpath('//div[@class="row"]//li[@role="tab"]')[1].click()
 driver.find_elements_by_xpath('//div[@class="col-xs-12 col-md-4 text-center"][@style="border-left: 1px solid #000000;"]')[-1].click()
 driver.find_elements_by_xpath('//table[@class="table table-hover table-info"]//tbody//tr[@height="18"]//td[@height="18"]')[-1].click()


การทำงานกับเวปที่มีการเข้า id, password

การระบุตำแหน่ง และส่งคำสั่งพิมพ์ สามารถใช้ประยุกต์สำหรับเวปไซต์ที่มีการเข้า id, password ได้


กำหนด email, password
In [ ]:
email = ''
password = ''
ส่งคำสั่งพิมพ์ข้อความลงไปยังในช่อง id, password
In [ ]:
driver.find_element_by_xpath('//input[@placeholder="E-mail or Username"]').send_keys(email)
driver.find_element_by_xpath('//input[@placeholder="Password"]').send_keys(password)
driver.find_element_by_xpath('//input[@value="ลงชื่อเข้าใช้"]').submit()
ถ้าเลือกเก็บได้จะทำงานกับเวปไหน และเพราะอะไร เม้นท์บอกเราด้านล่าง หรือบอกเราผ่าน Discord เวปไซต์ที่น่าสนใจจะถูกหยิบมาสร้างเป็นบทเรียนถัดไป!

31,149 views0 comments

Comments


bottom of page