- BeautifulSoup เหมาะอย่างยิ่งสำหรับการแยกวิเคราะห์ HTML แบบคงที่ให้เป็นข้อมูลที่มีโครงสร้าง ในขณะที่ Selenium จะช่วยทำให้เบราว์เซอร์จัดการเว็บไซต์ที่มี JavaScript จำนวนมากหรือเว็บไซต์ที่ต้องล็อกอินโดยอัตโนมัติ
- การดึงข้อมูลที่มีประสิทธิภาพเริ่มต้นด้วยการตรวจสอบ URL และโครงสร้าง DOM ในเครื่องมือสำหรับนักพัฒนา เพื่อค้นหาตัวเลือกที่เสถียรและทำความเข้าใจว่าเว็บไซต์นำเสนอเนื้อหาอย่างไร
- การผสานรวม Selenium สำหรับการเรนเดอร์และ BeautifulSoup สำหรับการแยกวิเคราะห์ ช่วยให้สามารถสร้างไปป์ไลน์ที่แข็งแกร่งสำหรับหน้าเว็บแบบไดนามิก กระบวนการที่ต้องมีการตรวจสอบสิทธิ์ และการโต้ตอบกับผู้ใช้ที่ซับซ้อน
- โปรแกรมดึงข้อมูลที่มีจริยธรรมและทนทานจะเคารพขอบเขตทางกฎหมาย ควบคุมปริมาณคำขอ จัดการกับการเปลี่ยนแปลงของเว็บไซต์ได้อย่างราบรื่น และมักจะสร้างชุดข้อมูลสำหรับการวิเคราะห์และการปรับแต่ง LLM ให้ดียิ่งขึ้น

การดึงข้อมูลจากเว็บไซต์ (Web scraping) ได้กลายเป็นหนึ่งในพลังขับเคลื่อนเบื้องหลังที่ช่วยเสริมประสิทธิภาพให้กับแดชบอร์ด รายงาน โมเดลการเรียนรู้ของเครื่อง และเครื่องมือภายในต่างๆ อย่างเงียบๆ แต่คนส่วนใหญ่เห็นเพียงแค่ตัวเลขสุดท้ายเท่านั้น หากคุณทำงานเกี่ยวกับข้อมูล คุณอาจต้องการดึงข้อมูลจากเว็บไซต์โดยอัตโนมัติแทนการคัดลอกและวางด้วยตนเอง และนั่นคือจุดเด่นของ Python, BeautifulSoup และ Selenium
เมื่อคุณเริ่มศึกษาเรื่องการดึงข้อมูลจากเว็บไซต์ คุณจะพบกับคำถามสำคัญอย่างรวดเร็ว: คุณควรใช้ BeautifulSoup ในการแยกวิเคราะห์ HTML โดยตรง หรือใช้ Selenium ในเบราว์เซอร์จริง หรืออาจจะใช้ทั้งสองวิธีร่วมกัน? หน้าเว็บแบบคงที่, ส่วนหน้าเว็บที่ใช้ JavaScript จำนวนมาก, ระบบล็อกอิน, ข้อจำกัดด้านอัตราการใช้งาน และข้อจำกัดด้านจริยธรรม ล้วนส่งผลต่อการเลือกใช้ ในคู่มือนี้ เราจะอธิบายวิธีการทำงานของการดึงข้อมูล (scraping) ว่าเมื่อใดที่ BeautifulSoup เพียงพอ เมื่อใดที่ Selenium คุ้มค่ากับค่าใช้จ่ายเพิ่มเติม และวิธีการเชื่อมต่อเข้าด้วยกันในเวิร์กโฟลว์ที่แข็งแกร่งและใช้งานได้จริง
ทำความเข้าใจเกี่ยวกับการดึงข้อมูลจากเว็บไซต์ และเมื่อไหร่ที่คุณจำเป็นต้องใช้มันจริงๆ
โดยพื้นฐานแล้ว การดึงข้อมูลจากเว็บไซต์ (Web Scraping) คือการรวบรวมข้อมูลจากเว็บไซต์โดยอัตโนมัติ โดยแปลงโค้ด HTML ที่มนุษย์อ่านได้ ให้เป็นข้อมูลที่มีโครงสร้างซึ่งโค้ดของคุณสามารถนำไปใช้ได้ นั่นอาจหมายถึงการดึงข้อมูลราคา ประกาศรับสมัครงาน บทวิจารณ์ บทความวิจัย หรือแม้แต่ความคิดเห็น เพื่อวิเคราะห์ความรู้สึกเกี่ยวกับหัวข้อหรือผลิตภัณฑ์เฉพาะเจาะจง
การดึงข้อมูลจากเว็บไซต์ (Scraping) นั้นลึกซึ้งกว่าการดึงข้อมูลจากหน้าจอทั่วไป เพราะคุณไม่ได้จำกัดอยู่แค่สิ่งที่แสดงผลบนหน้าจอเท่านั้น แต่คุณยังสามารถดึงข้อมูลจาก HTML, คุณสมบัติ และบางครั้งอาจรวมถึงข้อมูล JSON ที่ไม่เคยปรากฏบนหน้าเว็บโดยตรงอีกด้วย ตัวอย่างเช่น แทนที่จะคัดลอกบทความทั้งหมดและคอมเมนต์หลายร้อยรายการ คุณสามารถดึงเฉพาะข้อความและเวลาที่แสดงความคิดเห็น แล้วป้อนข้อมูลเหล่านั้นเข้าสู่กระบวนการวิเคราะห์ความรู้สึกได้
เหตุผลหลักที่การดึงข้อมูลจากเว็บไซต์ (scraping) ได้รับความนิยมอย่างมากในปัจจุบันก็คือ ข้อมูลเป็นวัตถุดิบสำคัญสำหรับการวิเคราะห์ ระบบแนะนำสินค้า ระบบอัตโนมัติในการบริการลูกค้า และโดยเฉพาะอย่างยิ่งสำหรับการปรับแต่งโมเดลภาษาขนาดใหญ่ (LLMs) ให้ดียิ่งขึ้น ด้วยไปป์ไลน์ที่เหมาะสม คุณสามารถเก็บเกี่ยวเนื้อหาใหม่ๆ ที่เฉพาะเจาะจงกับโดเมนได้อย่างต่อเนื่อง และทำให้โมเดลและแดชบอร์ดของคุณสอดคล้องกับความเป็นจริงอยู่เสมอ การบูรณาการคลังข้อมูลและ Data Lake แทนที่จะถูกแช่แข็งไว้ที่วันตัดรอบการฝึกอบรมครั้งสุดท้าย
แน่นอนว่า การขูดหินก็มีด้านมืดเช่นกัน หากทำอย่างไม่ระมัดระวังหรือรุนแรงเกินไป ดังนั้นคุณจึงต้องพิจารณาข้อกำหนดทางกฎหมาย ข้อจำกัดทางเทคนิค และจริยธรรมของสิ่งที่คุณเก็บรวบรวมและความถี่ในการเก็บรวบรวมอยู่เสมอ การละเลยข้อจำกัดเหล่านั้นอาจทำให้เซิร์ฟเวอร์ทำงานหนักเกินไป ละเมิดสัญญา หรือเปิดเผยข้อมูลส่วนตัวหรือข้อมูลที่มีลิขสิทธิ์ ซึ่งจะทำให้คุณประสบปัญหาอย่างรวดเร็ว
BeautifulSoup กับ Selenium: สองเครื่องมือที่เสริมกันอย่างลงตัว

ชุดเครื่องมือสำหรับการดึงข้อมูลจากเว็บไซต์ด้วย Python นั้นมีมากมาย แต่มีสองชื่อที่ปรากฏขึ้นมาบ่อย ๆ คือ BeautifulSoup และ Selenium ซึ่งทั้งสองโปรแกรมนี้แก้ปัญหาในส่วนที่แตกต่างกันอย่างสิ้นเชิง BeautifulSoup เป็นไลบรารีสำหรับการแยกวิเคราะห์ข้อมูล: มันรับ HTML หรือ XML และมี API ที่ใช้งานง่ายสำหรับการสำรวจโครงสร้าง DOM การกรององค์ประกอบ และการดึงส่วนที่คุณสนใจออกมา มันไม่ได้ดาวน์โหลดหน้าเว็บหรือเรียกใช้ JavaScript ด้วยตัวเอง
ในทางกลับกัน Selenium จะจำลองการทำงานของเบราว์เซอร์จริงโดยอัตโนมัติ: มันจะเปิด Chrome, Firefox, Edge หรือเบราว์เซอร์อื่นๆ ผ่าน WebDriver คลิกปุ่มต่างๆ กรอกแบบฟอร์ม รอให้ JavaScript ทำงาน และจากนั้นจะแสดงหน้าเว็บที่แสดงผลเสร็จสมบูรณ์ให้คุณ จากมุมมองของ Selenium คุณก็เป็นเพียงผู้ใช้ขั้นสูงที่มีความเร็วและความอดทนสูงมากคนหนึ่ง ที่ควบคุมเบราว์เซอร์ผ่านทางโค้ด
โดยทั่วไปแล้ว BeautifulSoup เหมาะอย่างยิ่งสำหรับการดึงข้อมูลจากเว็บไซต์แบบคงที่หรือ HTML ที่ได้จากการร้องขอ HTTP ปกติ ในขณะที่ Selenium เป็นเครื่องมือที่เหมาะสมที่สุดเมื่อเว็บไซต์มีความเปลี่ยนแปลงสูง สร้างขึ้นโดยใช้ JavaScript ฝั่งไคลเอ็นต์ หรือมีการล็อกอยู่เบื้องหลังขั้นตอนการเข้าสู่ระบบและการโต้ตอบกับผู้ใช้ที่ซับซ้อน ในระบบการผลิตหลายๆ ระบบ มักจะรวมทั้งสองอย่างเข้าด้วยกัน: Selenium ทำหน้าที่ดึงข้อมูลและแสดงผล ในขณะที่ BeautifulSoup ทำหน้าที่แยกวิเคราะห์ภาพรวม HTML
นอกจากนี้ยังมีประเด็นเรื่องการบำรุงรักษาและความซับซ้อนที่ควรพิจารณาด้วย: Selenium มีการใช้ไดรเวอร์เบราว์เซอร์ ปัญหาความเข้ากันได้ของเวอร์ชัน และส่วนประกอบอื่นๆ มากมาย ในขณะที่ BeautifulSoup มีน้ำหนักเบาและใช้งานง่าย แต่มีข้อจำกัดอยู่ที่ HTML ที่คุณสามารถเข้าถึงได้โดยไม่ต้องใช้ JavaScript การเลือกใช้เครื่องมือที่ไม่เหมาะสมกับงาน มักจะทำให้คุณทำงานช้าลงโดยไม่จำเป็น หรือทำให้โปรแกรมดึงข้อมูลของคุณใช้งานยากและเปราะบางเกินไปเมื่อเว็บไซต์มีการเปลี่ยนแปลง
BeautifulSoup ผสานเข้ากับกระบวนการดึงข้อมูลแบบทั่วไปได้อย่างไร
โดยปกติแล้ว BeautifulSoup จะถูกเชื่อมต่อเข้ากับกระบวนการทำงานแบบง่ายๆ คือ ดึง HTML (ซึ่งมักจะใช้...) การร้องขอ (ไลบรารี) แยกข้อมูลออกเป็นโครงสร้างแบบต้นไม้ นำทางไปยังโหนดที่เกี่ยวข้อง และส่งออกผลลัพธ์เป็นไฟล์ CSV, JSON หรือฐานข้อมูล análisis de datos con SQL. กระบวนการดังกล่าวใช้งานได้ดีอย่างยิ่งสำหรับหน้าเว็บแบบคงที่ เช่น เว็บไซต์เอกสาร เว็บไซต์หางานแบบง่ายๆ คลังข่าว หรือเว็บไซต์ทดลองที่ออกแบบมาเพื่อฝึกฝนการดึงข้อมูล
ภายใต้กลไกการทำงานภายใน BeautifulSoup จะแปลง HTML ที่ยุ่งเหยิงให้เป็นโครงสร้างอ็อบเจ็กต์ Python ซึ่งแต่ละองค์ประกอบ—แท็ก แอตทริบิวต์ โหนดข้อความ—สามารถเข้าถึงได้ผ่านวิธีการที่ใช้งานง่าย เช่น find(), find_all()และการกรองแบบ CSS คุณสามารถค้นหาองค์ประกอบได้โดยใช้ชื่อแท็ก รหัส คลาส หรือแม้กระทั่งการจับคู่เนื้อหาข้อความหรือฟังก์ชันที่กำหนดเอง
เมื่อคุณพบส่วนที่ถูกต้องของหน้าเว็บแล้ว คุณสามารถเจาะลึกลงไปได้อีกโดยการเลื่อนไปมาระหว่างผู้ปกครอง ลูก และพี่น้องใน DOM เพื่อดึงข้อมูลออกมา .text เนื้อหาสำหรับสตริงที่มองเห็นได้หรือค่าแอตริบิวต์ เช่น href สำหรับลิงก์หรือ src สำหรับภาพ รูปแบบการนำทางนั้นให้ความรู้สึกคล้ายคลึงกับวิธีการตรวจสอบองค์ประกอบในเครื่องมือสำหรับนักพัฒนาเบราว์เซอร์เป็นอย่างมาก
ตัวอย่างเช่น สำหรับเว็บไซต์ประกาศรับสมัครงานแบบคงที่ คุณสามารถดึงโค้ด HTML ของหน้าประกาศรับสมัครงาน ระบุคอนเทนเนอร์ที่ครอบการ์ดงานทั้งหมดโดยใช้ ID ของมัน จากนั้นใช้ BeautifulSoup เพื่อค้นหาการ์ดงานแต่ละใบ ดึงชื่อตำแหน่งงาน บริษัท สถานที่ และ URL ของแอปพลิเคชัน ทั้งหมดนี้โดยไม่ต้องเปิดเบราว์เซอร์เต็มรูปแบบเลย นั่นหมายถึงการใช้ทรัพยากรน้อยลง การประมวลผลเร็วขึ้น และการปรับใช้ไปยังเซิร์ฟเวอร์หรือไปป์ไลน์ CI ได้ง่ายขึ้น
ตรวจสอบเว็บไซต์เป้าหมายก่อนเขียนโค้ด
ก่อนที่จะเขียนโค้ด Python แม้แต่บรรทัดเดียว กระบวนการทำงานการดึงข้อมูลที่ดีควรเริ่มต้นด้วยการเปิดเครื่องมือสำหรับนักพัฒนาในเบราว์เซอร์ และสวมบทบาทเป็น "นักสืบ HTML" เป้าหมายของคุณคือการทำความเข้าใจว่าควรเรียกใช้ URL ใด ข้อมูลอยู่ในองค์ประกอบใด และโครงสร้างเหล่านั้นมีความเสถียรมากน้อยเพียงใด
ขั้นตอนแรกคือใช้งานเว็บไซต์เหมือนผู้ใช้ทั่วไป: คลิกไปมา ใช้ตัวกรอง เปิดหน้าแสดงรายละเอียด และสังเกตดูว่าแถบ URL เปลี่ยนแปลงอย่างไรขณะที่คุณกำลังใช้งาน คุณจะสังเกตเห็นรูปแบบต่างๆ ได้อย่างรวดเร็ว เช่น ส่วนของเส้นทางสำหรับรายการเฉพาะ หรือพารามิเตอร์การค้นหาที่แสดงถึงคำค้นหา สถานที่ หรือตัวกรอง
URL นั้นเข้ารหัสข้อมูลจำนวนมาก โดยเฉพาะอย่างยิ่งผ่านทางสตริงคำค้นหา ซึ่งคุณจะเห็นคู่คีย์-ค่า เช่น ?q=software+developer&l=Australia ซึ่งควบคุมสิ่งที่เซิร์ฟเวอร์ส่งกลับมา การที่สามารถปรับแต่งพารามิเตอร์เหล่านั้นด้วยตนเองในแถบที่อยู่ มักจะช่วยให้คุณสร้างชุดผลลัพธ์ใหม่ได้โดยไม่ต้องแก้ไขโค้ด HTML เลย
เมื่อคุณเข้าใจรูปแบบการนำทางแล้ว ให้เปิดเครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์ ซึ่งโดยปกติจะใช้ตัวเลือก "ตรวจสอบ" หรือแป้นพิมพ์ลัด แล้วดูที่แท็บ "องค์ประกอบ" หรือ "ตัวตรวจสอบ" เพื่อสำรวจ DOM การวางเมาส์เหนือรายการต่างๆ ในบานหน้าต่าง HTML จะเน้นการแสดงผลของรายการเหล่านั้นบนหน้าเว็บ ทำให้ระบุคอนเทนเนอร์ ชื่อเรื่อง เมตาเดตา และปุ่มต่างๆ ได้ง่ายขึ้นมาก
ที่นี่คุณกำลังมองหาจุดเชื่อมโยงที่เสถียร: รหัส ชื่อคลาส หรือโครงสร้างแท็กที่ซ้ำกันอย่างคาดเดาได้ในทุกรายการที่คุณต้องการรวบรวม เช่น div โดยมีรหัสที่เก็บผลลัพธ์ทั้งหมด หรือ article ติดแท็กที่มีคลาสเฉพาะห่อหุ้มสินค้าหรือใบงานแต่ละรายการ ยิ่งตะขอเหล่านั้นแข็งแรงและมีรายละเอียดมากเท่าไหร่ เครื่องขูดของคุณก็จะยิ่งทนทานมากขึ้นเท่านั้น เมื่อเกิดการเปลี่ยนแปลงเล็กน้อยทางด้านความสวยงาม
เว็บไซต์แบบคงที่และแบบไดนามิก: ทำไมจึงสำคัญ
จากมุมมองของโปรแกรมดึงข้อมูล เว็บสามารถแบ่งออกเป็นสองกลุ่มใหญ่ๆ คือ เว็บไซต์แบบคงที่ (static sites) ที่ส่งโค้ด HTML ที่สร้างไว้แล้วมาให้ และแอปพลิเคชันแบบไดนามิก (dynamic apps) ที่ส่งโค้ด JavaScript มาให้ และขอให้เบราว์เซอร์ของคุณประกอบหน้าเว็บขึ้นมาแบบเรียลไทม์ ความแตกต่างนี้จะเป็นตัวกำหนดว่าการใช้ requests ร่วมกับ BeautifulSoup นั้นเพียงพอหรือไม่ หรือคุณจำเป็นต้องใช้เลเยอร์การทำงานอัตโนมัติของเบราว์เซอร์แบบเต็มรูปแบบ เช่น Selenium
ในหน้าเว็บแบบคงที่ HTML ที่คุณดึงมาด้วย HTTP GET จะมีชื่อเรื่อง ราคา รีวิว และลิงก์ที่คุณต้องการอยู่แล้ว แม้ว่าโครงสร้าง HTML อาจดูยุ่งเหยิงในตอนแรกก็ตาม เมื่อคุณดาวน์โหลดเนื้อหาการตอบกลับแล้ว BeautifulSoup จะสามารถแยกวิเคราะห์และกรองข้อมูลได้ตามต้องการโดยไม่ต้องเรียกใช้ JavaScript ใดๆ
เว็บไซต์แบบไดนามิก ซึ่งมักสร้างด้วยเฟรมเวิร์ก เช่น React, Vue หรือ Angular จะส่งคืนค่าโครงสร้าง HTML ที่กระชับและชุดโค้ด JavaScript จำนวนมากที่ทำงานในเบราว์เซอร์ เรียกใช้ API และจัดการ DOM เพื่อแทรกเนื้อหา ถ้าคุณใช้เพียงอย่างเดียว การร้องขอคุณจะเห็นโครงร่างมาร์กอัปหรือปลายทาง JSON ดิบๆ ไม่ใช่ตารางงานหรือตารางสินค้าที่แสดงผลอย่างสวยงามอย่างที่คุณตรวจสอบก่อนหน้านี้
สำหรับหน้าเว็บที่มี JavaScript จำนวนมาก คุณจำเป็นต้องใช้เครื่องมือที่สามารถเรียกใช้สคริปต์ได้ เช่น Selenium หรือเบราว์เซอร์แบบ Headless หรือไม่ก็ต้องทำการวิเคราะห์ย้อนกลับ (Reverse-engineer) API ที่หน้าเว็บเรียกใช้ และเรียกใช้ API เหล่านั้นโดยตรง BeautifulSoup ยังคงมีบทบาทสำคัญในการแยกวิเคราะห์ HTML ที่ได้มา แต่ไม่สามารถดำเนินการขั้นตอนการแสดงผลได้ด้วยตัวเอง
นอกจากนี้ยังมีหมวดหมู่แบบผสมผสานที่ข้อมูลนั้นโดยทางเทคนิคแล้วคงที่ แต่ซ่อนอยู่หลังแบบฟอร์มการเข้าสู่ระบบหรือกระบวนการหลายขั้นตอน เช่น แดชบอร์ดหรือเนื้อหาการสมัครสมาชิก และในสถานการณ์เหล่านั้น Selenium มีประโยชน์อย่างยิ่งในการทำให้การพิมพ์ข้อมูลประจำตัว การกดปุ่มเป็นไปโดยอัตโนมัติ แล้วจึงส่งภาพรวม HTML สุดท้ายไปยัง BeautifulSoup
ขั้นตอนการใช้งาน BeautifulSoup บนเว็บไซต์แบบคงที่ (Static Site) ที่ใช้งานได้จริง
เพื่อให้เห็นภาพการทำงานของ BeautifulSoup ลองนึกภาพการดึงข้อมูลจากเว็บไซต์หางานฝึกอบรม หรือเว็บไซต์ทดลอง "หนังสือที่ต้องดึงข้อมูล" ซึ่งแสดงผลเป็น HTML ธรรมดาที่มีโครงสร้างสม่ำเสมอสำหรับแต่ละรายการ เริ่มต้นด้วยการสร้างสภาพแวดล้อมเสมือนจริงและติดตั้งโปรแกรม การร้องขอ และ สวยและเขียนสคริปต์ขนาดเล็กเพื่อดึงข้อมูลหน้าแคตตาล็อก
เมื่อคุณดาวน์โหลดเนื้อหาของหน้าเว็บเสร็จแล้ว คุณจะต้องส่งเนื้อหาการตอบกลับไปยัง BeautifulSoup(html, "html.parser")ซึ่งจะสร้างโครงสร้างต้นไม้สำหรับการวิเคราะห์เพื่อให้คุณสามารถสำรวจอ็อบเจ็กต์ Python แทนที่จะเป็นสตริงดิบๆ จากตรงนั้น คุณสามารถโทรได้ soup.find() or soup.find_all() เพื่อกำหนดเป้าหมายไปยังแท็กและคลาสที่เฉพาะเจาะจง
สมมติว่าหนังสือแต่ละเล่มถูกห่อด้วย... <article class="product_pod"> แท็ก: คุณสามารถค้นหาโหนดทั้งหมดดังกล่าว จากนั้นสำหรับแต่ละบทความ ให้ค้นหาแท็ก <h3> แท็กที่มีลิงก์ฝังตัวเพื่อดึงชื่อเรื่องและ URL สัมพัทธ์ รวมทั้ง... <p class="price_color"> แท็กเพื่อดึงราคา เนื้อหาข้อความมาจาก .text คุณลักษณะ ในขณะที่คุณลักษณะเช่น href or title ทำหน้าที่เหมือนคีย์ในพจนานุกรม
เมื่อคุณวนซ้ำไปตามองค์ประกอบเหล่านั้น คุณจะสร้างพจนานุกรม Python ที่เก็บฟิลด์ที่คุณสนใจและเพิ่มลงในรายการ ซึ่งคุณสามารถแปลงเป็น JSON ได้ procesamiento de JSON en SQLแปลงเป็น DataFrame หรือส่งตรงไปยังฐานข้อมูลของคุณ ด้วยระบบนำทางแบบต้นไม้ คุณจึงแทบไม่จำเป็นต้องใช้ regular expression ที่ซับซ้อนนัก แต่ regular expression ก็ยังคงมีประโยชน์เมื่อต้องการจับคู่ข้อความภายในโหนดต่างๆ
แนวทางนี้สามารถนำไปปรับใช้ได้ดีกับรายการแบบคงที่ทุกประเภท เช่น ประกาศรับสมัครงาน คลังบทความในบล็อก รายการอสังหาริมทรัพย์ หรือดัชนีเอกสาร โดยมีเงื่อนไขว่า HTML ต้องมีโครงสร้างที่สม่ำเสมออย่างน้อยบางส่วนที่คุณสามารถยึดเป็นหลักได้ เมื่อเว็บไซต์มีการเปลี่ยนแปลง โดยทั่วไปคุณเพียงแค่ต้องปรับตัวเลือกบางส่วนเท่านั้น แทนที่จะเขียนโปรแกรมดึงข้อมูลใหม่ทั้งหมด
การผสานรวม Selenium และ BeautifulSoup สำหรับการประมวลผลโฟลว์ที่ซับซ้อน
สำหรับหน้าเว็บแบบไดนามิกหรือเนื้อหาที่ต้องล็อกอินเพื่อป้องกันการเข้าถึง การใช้ Selenium เป็นกลไกประมวลผลของเบราว์เซอร์ ร่วมกับ BeautifulSoup เป็นตัวแยกวิเคราะห์ HTML มักจะให้ผลลัพธ์ที่ดีที่สุด Selenium ช่วยให้คุณได้ DOM ที่แสดงผลอย่างสมบูรณ์และสามารถโต้ตอบกับหน้าเว็บได้ ในขณะที่ BeautifulSoup จะแปลง DOM นั้นให้เป็นโครงสร้างต้นไม้ที่จัดการได้และสามารถสืบค้นได้
โดยทั่วไปแล้วลำดับขั้นตอนหลักๆ จะเป็นดังนี้: เปิดใช้งาน WebDriver (เช่น Chrome), ไปยัง URL เป้าหมาย, รอจนกว่าองค์ประกอบที่สำคัญจะโหลดเสร็จสมบูรณ์ จากนั้นจึงดึงข้อมูล page_sourceซึ่งคุณจะนำไปป้อนเข้าสู่ BeautifulSoup จากจุดนั้นเป็นต้นไป โค้ดของคุณจะดูคล้ายกับสคริปต์การแยกวิเคราะห์เว็บไซต์แบบคงที่ทั่วไป
Selenium WebDriver API ช่วยให้คุณค้นหาฟิลด์และปุ่มต่างๆ ผ่านตัวเลือก CSS, XPath, id หรือแอตทริบิวต์ name จากนั้นส่งคำสั่งกดแป้นพิมพ์ คลิก เลื่อน หรือแม้กระทั่งอัปโหลดไฟล์ ราวกับว่าคุณกำลังควบคุมเมาส์และแป้นพิมพ์ด้วยตัวเอง ด้วยเหตุนี้จึงเหมาะอย่างยิ่งสำหรับการจัดการแบบฟอร์มลงชื่อเข้าใช้ แบนเนอร์คุกกี้ ตัวกรองแบบดรอปดาวน์ การเลื่อนแบบไม่สิ้นสุด หรือวิซาร์ดแบบหลายขั้นตอน
ตัวอย่างเช่น คุณอาจเปิดหน้าล็อกอิน ป้อนข้อมูลประจำตัว ส่งแบบฟอร์ม รอจนกว่า URL ปัจจุบันจะตรงกับแดชบอร์ดเป้าหมาย จากนั้นจึงบันทึก HTML ทั้งหมดเพื่อส่งต่อไปยัง BeautifulSoup เพื่อทำการดึงข้อมูลโดยละเอียด เมื่อคุณทำการดึงข้อมูลเสร็จแล้ว ให้โทรติดต่อ driver.quit() ล้างกระบวนการทำงานของเบราว์เซอร์และปล่อยทรัพยากร
เครื่องมือที่ชอบ webdriver_manager สามารถดาวน์โหลดไดรเวอร์เบราว์เซอร์ที่ถูกต้องโดยอัตโนมัติ ซึ่งช่วยให้คุณไม่ต้องยุ่งยากกับการจัดการไฟล์ไบนารีด้วยตนเองเมื่อเบราว์เซอร์มีการพัฒนา และเป็นส่วนหนึ่งของสิ่งที่ดี การบริหารการพึ่งพาและภาษา Python. คุณยังคงต้องคอยตรวจสอบความเข้ากันได้ของเวอร์ชันอยู่ แต่การติดตั้งจะง่ายขึ้นอย่างมากเมื่อเทียบกับการเลือกไดรเวอร์ด้วยตนเอง
การดึงข้อมูลเนื้อหาแบบไดนามิก: ตัวอย่างสไตล์ YouTube
แพลตฟอร์มแบบไดนามิก เช่น เว็บไซต์วิดีโอสมัยใหม่ เป็นตัวอย่างคลาสสิกที่แสดงให้เห็นถึงประสิทธิภาพของ Selenium เพราะแพลตฟอร์มเหล่านี้จะโหลดเนื้อหาเพิ่มเติมโดยอัตโนมัติเมื่อคุณเลื่อนหรือโต้ตอบกับหน้าเว็บเท่านั้น โดยปกติแล้ว การเรียก HTTP GET เพียงครั้งเดียวจะส่งคืนเพียงวิวพอร์ตเริ่มต้นและเชลล์ JavaScript เท่านั้น
ลองนึกภาพว่าคุณต้องการรวบรวมข้อมูลเมตาสำหรับวิดีโอ 100 รายการล่าสุดจากช่องหนึ่งๆ เช่น URL, ชื่อเรื่อง, ระยะเวลา, วันที่อัปโหลด และจำนวนการดู คุณจะต้องใช้ Selenium ชี้ไปยังแท็บวิดีโอของช่อง รอให้หน้าเว็บโหลดเสร็จ แล้วจำลองการกดปุ่ม End หลายๆ ครั้ง เพื่อให้เว็บไซต์เพิ่มรายการลงในตารางเรื่อยๆ
หลังจากเลื่อนหน้าจอไปสองสามรอบและหยุดพักชั่วครู่เพื่อให้ JavaScript ดึงข้อมูลและแสดงผลส่วนใหม่ คุณสามารถเลือกคอนเทนเนอร์วิดีโอทั้งหมดได้ ซึ่งมักแสดงด้วยแท็กแบบกำหนดเอง เช่น <video> ytd-rich-grid-media—และวนซ้ำผ่านพวกมันเพื่อดึงเนื้อหาที่ซ้อนกันอยู่ภายใน ภายในแต่ละคอนเทนเนอร์ คุณจะพบแท็กลิงก์ที่บรรจุข้อมูลอยู่ href และชื่อเรื่อง แท็ก span ที่มี aria-label สำหรับระยะเวลา รวมถึง span เมตาเดต้าแบบอินไลน์ที่แสดงข้อมูลการดูและอัปโหลด
ซีลีเนียม find_element และ find_elements วิธีการเหล่านี้ เมื่อรวมกับ XPath หรือตัวเลือก CSS จะทำให้การเจาะลึกเข้าไปในแต่ละคอนเทนเนอร์และดึงค่าเหล่านั้นออกมาเป็นเรื่องง่าย เมื่อคุณรวบรวมข้อมูลทั้งหมดไว้ในรายการพจนานุกรมแล้ว การแปลงข้อมูลเป็น JSON อย่างรวดเร็วจะเขียนชุดข้อมูลของคุณลงดิสก์เพื่อนำไปวิเคราะห์ในภายหลัง
สุดท้าย คุณปิดหน้าต่างเบราว์เซอร์ด้วย driver.close() or driver.quit()ส่งผลให้คุณมีสคริปต์ที่สามารถใช้งานซ้ำได้ สามารถกำหนดเวลา สร้างเวอร์ชัน และขยายเพิ่มเติมได้เมื่อระบบประมวลผลข้อมูลของคุณเติบโตขึ้น ในหลายกรณี ข้อมูลนี้จะกลายเป็นชุดข้อมูลสำหรับการฝึกฝนหรือประเมินผลสำหรับโมเดล แดชบอร์ด หรือเครื่องมือค้นหาภายในองค์กรในขั้นตอนต่อไป
การขยายขนาด: การดึงข้อมูลจากเว็บไซต์เพื่อปรับแต่ง LLM ให้เหมาะสมยิ่งขึ้น
ด้วยการพัฒนาของ LLM ที่ได้รับการปรับแต่งอย่างละเอียด การดึงข้อมูลจึงได้พัฒนาจากเทคนิคทางวิศวกรรมข้อมูลเฉพาะกลุ่มไปสู่หนทางสำคัญในการสร้างคลังข้อมูลฝึกอบรมเฉพาะทางและรักษาความทันสมัยของคลังข้อมูลเหล่านั้น โมเดลทั่วไปที่ฝึกฝนด้วยภาพรวมจากอินเทอร์เน็ตสาธารณะมักจะตามไม่ทันการเปลี่ยนแปลงในโลกแห่งความเป็นจริง หรือขาดคำศัพท์ รูปแบบ และขั้นตอนการทำงานภายในองค์กรของคุณ
ด้วยการรวบรวมข้อมูลจากเว็บไซต์เป้าหมาย ไม่ว่าจะเป็นเอกสารสาธารณะ ฟอรัมเฉพาะทาง วารสารวิจัย หรือฐานความรู้ภายในองค์กรของคุณเอง คุณสามารถรวบรวมชุดข้อมูลที่สะท้อนถึงภาษา น้ำเสียง และรูปแบบที่คุณต้องการให้โมเดลของคุณเชี่ยวชาญได้อย่างแม่นยำ สำหรับผู้ช่วยฝ่ายสนับสนุนลูกค้า นั่นอาจหมายถึงการรวบรวมคำถามที่พบบ่อย บทความในศูนย์ช่วยเหลือ แม่แบบอีเมล และแม้แต่บันทึกการสนทนาที่ไม่ระบุตัวตน
BeautifulSoup มีบทบาทสำคัญอย่างยิ่งในกรณีนี้ เมื่อแหล่งข้อมูลของคุณเป็น HTML แบบคงที่ หรือเข้าถึงได้ง่ายผ่านทางเอนด์พอยต์ GET แบบง่ายๆ เนื่องจากช่วยให้คุณกำจัดสิ่งรกเกะกะในการนำทาง โฆษณา และมาร์กอัปตกแต่งต่างๆ ออกไป เหลือไว้เพียงข้อความหลักและข้อมูลเมตาที่สอดคล้องกับสคีมาการฝึกอบรมของคุณ คุณสามารถติดแท็กส่วนต่างๆ แบ่งเนื้อหาออกเป็นตัวอย่าง และส่งออกเป็นไฟล์ JSON เพื่อนำไปปรับแต่งเพิ่มเติมหรือใช้ในไปป์ไลน์ RAG ได้
Selenium กลายเป็นสิ่งจำเป็นเมื่อแหล่งข้อมูลที่มีค่าเหล่านั้นบางส่วนอยู่หลังการตรวจสอบสิทธิ์ การเข้าถึงโดยเสียค่าใช้จ่าย หรือการใช้ JavaScript จำนวนมาก เช่น แดชบอร์ดภายในหรือพอร์ทัลลูกค้า ในกรณีเหล่านั้น คุณจะตั้งค่าเบราว์เซอร์ให้ล็อกอินและนำทางโดยอัตโนมัติ จากนั้นบันทึกภาพหน้าจอส่วนสำคัญๆ และแยกวิเคราะห์ด้วย BeautifulSoup เพื่อให้ได้ข้อความที่สะอาดตา
สิ่งสำคัญคือต้องเคารพนโยบายขององค์กร ใบอนุญาต และข้อจำกัดด้านความเป็นส่วนตัวเสมอ แม้ว่าเทคโนโลยีจะช่วยให้คุณสามารถดึงข้อมูลได้เกือบทุกอย่าง แต่กรอบกฎหมายและจริยธรรมของคุณควรจำกัดอย่างเข้มงวดว่าอะไรบ้างที่จะถูกนำไปใช้ในชุดข้อมูลฝึกอบรมหลักสูตร LLM ของคุณ นั่นหมายถึงการหลีกเลี่ยงข้อมูลส่วนบุคคลที่ละเอียดอ่อน การปฏิบัติตาม robots.txt และ ToS และการประสานงานกับทีมกำกับดูแลข้อมูลเมื่อมีข้อสงสัย
ข้อควรพิจารณาด้านจริยธรรมและกฎหมายเมื่อทำการคัดลอกข้อมูล
การที่เว็บเพจนั้นเปิดให้สาธารณะเข้าถึงได้ ไม่ได้หมายความว่าคุณสามารถคัดลอกเนื้อหาทั้งหมด สร้างระบบอัตโนมัติในการเข้าถึง หรือขายต่อเนื้อหาเหล่านั้นได้โดยไม่มีข้อจำกัด การดึงข้อมูลอย่างมีจริยธรรมเริ่มต้นจากการอ่านและเคารพข้อกำหนดในการให้บริการของเว็บไซต์ คำสั่งในไฟล์ robots.txt และรูปแบบธุรกิจที่ชัดเจน
เนื้อหาที่มีการป้องกันการคัดลอก เช่น บทความที่ต้องเสียค่าใช้จ่าย วารสารแบบสมัครสมาชิก และข่าวสารระดับพรีเมียม มักจะอยู่หลังกำแพงการชำระเงินก็เพราะว่าเนื้อหาเหล่านี้ไม่ได้มีไว้สำหรับการดาวน์โหลดและเผยแพร่ซ้ำในวงกว้างโดยบอท การดาวน์โหลดไฟล์ดังกล่าวจำนวนมากโดยอัตโนมัติอาจนำไปสู่การดำเนินคดีทางกฎหมาย นอกเหนือจากการถูกแบนบัญชีเพียงอย่างเดียว
ความเป็นส่วนตัวเป็นอีกหนึ่งข้อกังวลสำคัญ: การดึงข้อมูลจากหน้าเว็บที่เปิดเผยรายละเอียดส่วนบุคคล แดชบอร์ดส่วนตัว หรือข้อมูลเฉพาะบัญชี ถือเป็นเรื่องที่น่าสงสัยอย่างยิ่ง เว้นแต่คุณจะได้รับอนุญาตอย่างชัดเจนและมีมาตรการคุ้มครองข้อมูลที่เหมาะสม แม้แต่โปรไฟล์สาธารณะที่ดูเหมือน "ไม่มีอันตราย" ก็อาจอยู่ภายใต้กฎหมายคุ้มครองความเป็นส่วนตัวได้ ขึ้นอยู่กับเขตอำนาจศาลและลักษณะการใช้งาน
ในด้านเทคนิค คุณควรจำกัดจำนวนคำขอของคุณและหลีกเลี่ยงการส่งโปรแกรมดึงข้อมูลหลายตัวพร้อมกันไปยังเว็บไซต์เดียวกัน เพราะอาจทำให้ประสิทธิภาพลดลงหรือเกิดการหยุดชะงักได้ ควรใช้การหน่วงเวลาอย่างสุภาพ เคารพข้อจำกัดด้านอัตราการใช้งาน และใช้การแคชหรือการอัปเดตแบบเพิ่มทีละน้อยเพื่อลดภาระการทำงานทุกครั้งที่เป็นไปได้
สุดท้ายนี้ หากไม่แน่ใจ ให้ติดต่อเจ้าของเว็บไซต์หรือผู้ให้บริการเนื้อหา อธิบายกรณีการใช้งานของคุณ และดูว่าพวกเขามี API อย่างเป็นทางการหรือโปรแกรมพันธมิตรหรือไม่ โดยทั่วไปแล้ว API มักมีความเสถียร คาดการณ์ได้ และถูกต้องตามกฎหมายมากกว่าการดึงข้อมูลจากเว็บไซต์ แม้ว่าจะต้องใช้เวลาในการผสานรวมเอนด์พอยต์หรือระบบการตรวจสอบสิทธิ์ใหม่ก็ตาม
สร้างโปรแกรมดึงข้อมูลที่แข็งแกร่งและทนทานต่อการเปลี่ยนแปลงของเว็บไซต์
หนึ่งในความท้าทายที่สำคัญที่สุดในการดึงข้อมูลจากเว็บไซต์คือความทนทาน: เว็บไซต์มีการเปลี่ยนแปลง รูปแบบการเขียนโค้ดเปลี่ยนไป และทันใดนั้นตัวเลือกที่คุณปรับแต่งมาอย่างดีอาจส่งคืนรายการว่างเปล่าหรือทำให้สคริปต์ของคุณล่มได้ การปฏิบัติต่อโปรแกรมดึงข้อมูลเหมือนกับซอฟต์แวร์การผลิตอื่นๆ จะช่วยลดปัญหาต่างๆ ลงได้
เริ่มต้นด้วยการกำหนดเป้าหมายไปที่ตัวบ่งชี้ความหมายที่มีโอกาสเปลี่ยนแปลงน้อยกว่า เช่น ชื่อคลาสที่อธิบายลักษณะ รหัส หรือความสัมพันธ์เชิงโครงสร้าง แทนที่จะเป็นตัวเลือกที่เปราะบางมากซึ่งผูกติดกับตำแหน่งหรือคลาสที่มีลักษณะภายนอกเพียงอย่างเดียว เมื่อองค์ประกอบนั้นมีชื่อที่มีความหมาย เช่น card-content or results-containerโดยทั่วไปแล้ว วิธีนี้ปลอดภัยกว่าการพึ่งพาค่าสตริงคลาสที่สร้างขึ้นโดยอัตโนมัติแบบสุ่ม
ถัดไป ให้เพิ่มการจัดการข้อผิดพลาดเข้าไปด้วย: ทุกครั้งที่คุณเรียกใช้ฟังก์ชันนี้ find() or find_all()เตรียมพร้อมสำหรับกรณีที่องค์ประกอบนั้นหายไปหรือส่งคืน Noneและควรหลีกเลี่ยงการโทรโดยไม่ไตร่ตรอง .text บนอ็อบเจ็กต์ที่เป็นค่าว่าง การบันทึกข้อมูลที่ขาดหายไปและรูปแบบที่ไม่คาดฝันจะช่วยให้การแก้ไขข้อผิดพลาดง่ายขึ้นมากเมื่อมีการออกแบบใหม่
การทดสอบอัตโนมัติหรืองาน CI ที่กำหนดเวลาไว้ซึ่งเรียกใช้โปรแกรมดึงข้อมูลของคุณเป็นระยะๆ นั้นมีประโยชน์อย่างยิ่ง เพราะจะช่วยตรวจจับความผิดพลาดได้ตั้งแต่เนิ่นๆ แทนที่จะปล่อยให้ไปป์ไลน์ของคุณสร้างชุดข้อมูลที่ว่างเปล่าหรือเสียหายโดยไม่แจ้งให้ทราบล่วงหน้า แม้แต่การทดสอบเบื้องต้นง่ายๆ ที่ตรวจสอบจำนวนรายการที่ดึงออกมาเทียบกับค่าเกณฑ์ ก็สามารถตรวจจับข้อผิดพลาดที่สำคัญได้
สำหรับขั้นตอนการทำงานที่ใช้ Selenium นั้น คาดว่าการปรับแต่ง UI และการจัดเรียง DOM ใหม่เล็กน้อยอาจทำให้ตัวเลือก XPath แบบง่ายๆ ใช้งานไม่ได้ ดังนั้นควรทำให้ตัวระบุตำแหน่งของคุณเรียบง่ายและทนทานที่สุดเท่าที่จะเป็นไปได้ และรวมศูนย์ไว้ในที่เดียวในโค้ดของคุณ เมื่อทีมพัฒนาส่วนหน้าปรับแต่งมาร์กอัป คุณต้องการแก้ไขโมดูลเดียวแทนที่จะต้องตามหาตัวเลือก (selectors) ที่กระจายอยู่ทั่วสคริปต์หลายตัว
เมื่อเวลาผ่านไป คุณอาจค้นพบว่างานดึงข้อมูลบางอย่างมีความเสถียรมากกว่าเมื่อทำผ่าน API ที่มีการบันทึกไว้อย่างเป็นทางการ แม้ว่านั่นหมายถึงการเปลี่ยนจากการวิเคราะห์ HTML โดยสิ้นเชิงสำหรับบางปลายทางก็ตาม การนำ API มาใช้ร่วมกันในกรณีที่มีให้ใช้งาน และ BeautifulSoup กับ Selenium ในกรณีที่จำเป็น มักจะทำให้ได้สถาปัตยกรรมที่ดูแลรักษาง่ายที่สุด
โดยสรุปแล้ว BeautifulSoup และ Selenium ต่างส่งเสริมซึ่งกันและกันมากกว่าที่จะแข่งขันกัน: BeautifulSoup โดดเด่นในเรื่องการวิเคราะห์ HTML ที่รวดเร็วและเชื่อถือได้เมื่อคุณมีไฟล์ HTML แล้ว ในขณะที่ Selenium โดดเด่นในการจัดการกับประสบการณ์ที่ซับซ้อน มี JavaScript จำนวนมาก หรือต้องมีการตรวจสอบสิทธิ์ จนกระทั่งไฟล์ HTML นั้นพร้อมใช้งาน หากนำไปใช้อย่างรอบคอบ โดยคำนึงถึงจริยธรรม ประสิทธิภาพ และความสามารถในการบำรุงรักษา เทคโนโลยีเหล่านี้จะช่วยให้คุณเปลี่ยนเว็บที่เต็มไปด้วยข้อมูลมากมายและเปลี่ยนแปลงอยู่ตลอดเวลา ให้กลายเป็นชุดข้อมูลที่มีโครงสร้างสะอาดตา พร้อมสำหรับการวิเคราะห์ การสร้างแดชบอร์ด หรือการฝึกฝนโมเดลภาษาเฉพาะรุ่นต่อไป