Programming
น้องๆ เคยสงสัยไหมว่า เว็บไซต์ต่างๆ ที่เราเห็นข้อมูลมากมายเนี่ย เขาเอาข้อมูลมาจากไหนกัน? บางทีเขาอาจจะไม่ได้พิมพ์เองทั้งหมดนะ! หลายๆ ครั้ง เขาใช้เทคนิคที่เรียกว่า "Web Scraping" เพื่อดึงข้อมูลจากเว็บไซต์อื่นมาแสดงผล
Web Scraping ก็คือการที่เราใช้โปรแกรม (ส่วนใหญ่เขียนด้วยภาษา Python) เข้าไป "ขูด" เอาข้อมูลที่ต้องการจากหน้าเว็บเพจต่างๆ มาเก็บไว้ในรูปแบบที่เราต้องการ เช่น CSV, Excel หรือฐานข้อมูล พี่ว่ามันเหมือนเราไปเก็บผักตามทุ่งเลย แต่เปลี่ยนจากผักเป็นข้อมูลในเว็บแทน
แล้วทำไมมันถึงสำคัญน่ะเหรอ? สมัยพี่ทำร้านเน็ต SiamCafe เนี่ย พี่เคยใช้ Web Scraping เพื่อดึงข้อมูลราคาสินค้าจากเว็บขายอุปกรณ์คอมพิวเตอร์ต่างๆ มาเปรียบเทียบราคาให้ลูกค้าดู มันช่วยประหยัดเวลาไปเยอะมากๆ เลยนะ!
ก่อนจะไปเริ่มเขียนโค้ด พี่ว่าเรามาปูพื้นฐานกันก่อนดีกว่า จะได้ไม่งงตอนลงมือทำจริง
Web Scraping ทำงานกับ HTML เป็นหลัก เพราะฉะนั้นเราต้องเข้าใจโครงสร้าง HTML พื้นฐานก่อน HTML ก็คือภาษาที่ใช้สร้างหน้าเว็บที่เราเห็นกันนี่แหละ มันประกอบไปด้วย Tags ต่างๆ เช่น <p> สำหรับย่อหน้า, <h1> ถึง <h6> สำหรับหัวข้อ, <table> สำหรับตาราง และอื่นๆ อีกมากมาย
ลองนึกภาพว่า HTML คือโครงกระดูกของเว็บเพจ ส่วน CSS คือเสื้อผ้าหน้าผมที่ทำให้มันดูสวยงาม และ JavaScript คือสมองที่ทำให้มันฉลาดและตอบสนองต่อการกระทำของเรา
แน่นอนว่าเราต้องมีความรู้พื้นฐาน Python บ้างนิดหน่อย อย่างน้อยก็ต้องรู้จักตัวแปร, loop, if-else statement, และ function เพราะเราจะใช้ Python ในการเขียนโปรแกรม Web Scraping ของเรา
สมัยพี่เริ่มเขียน Python ใหม่ๆ พี่ก็งงเหมือนกันแหละ แต่พอฝึกไปเรื่อยๆ มันก็เริ่มเข้าที่เข้าทางเอง สู้ๆ นะ!
ทีนี้เรามาดูกันว่าจะเริ่ม Web Scraping ด้วย Python และ Beautiful Soup ยังไง พี่จะสอนแบบ Step-by-Step เลยนะ
ก่อนอื่นเลย เราต้องติดตั้ง Library ที่จำเป็นก่อน นั่นก็คือ requests (สำหรับดึงข้อมูลจากเว็บ) และ beautifulsoup4 (สำหรับ parsing HTML) เราสามารถติดตั้งได้ง่ายๆ ผ่าน pip (Python Package Installer) โดยใช้คำสั่งนี้ใน Command Prompt หรือ Terminal:
pip install requests beautifulsoup4
จำไว้ว่า pip คือเพื่อนที่ดีที่สุดของเราในการจัดการ Library ต่างๆ ใน Python
หลังจากติดตั้ง Library เสร็จแล้ว เราก็มาเริ่มดึงข้อมูล HTML จากเว็บกันเลย พี่จะยกตัวอย่างการดึงข้อมูลจาก SiamCafe Blog นะ สมมติว่าเราอยากดึงหัวข้อข่าวทั้งหมดจากหน้าแรก
import requests
from bs4 import BeautifulSoup
url = "https://siamcafe.net/blog/"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
Code snippet นี้จะทำการดึงข้อมูล HTML จาก SiamCafe Blog มาเก็บไว้ในตัวแปร soup โดยใช้ Beautiful Soup ในการ parsing HTML
หลังจากที่เรามีข้อมูล HTML อยู่ในมือแล้ว ขั้นตอนต่อไปก็คือการค้นหาและดึงข้อมูลที่เราต้องการออกมา สมมติว่าหัวข้อข่าวใน SiamCafe Blog ถูกเก็บไว้ใน Tag <h2> เราสามารถใช้ Beautiful Soup ในการค้นหา Tag นี้ได้ดังนี้:
headlines = soup.find_all("h2")
for headline in headlines:
print(headline.text)
Code snippet นี้จะทำการค้นหา Tag <h2> ทั้งหมดใน soup แล้วพิมพ์ข้อความ (text) ที่อยู่ใน Tag นั้นออกมา
Beautiful Soup ไม่ใช่ Library เดียวที่ใช้ในการทำ Web Scraping นะ ยังมี Library อื่นๆ อีกมากมาย เช่น Scrapy, Selenium, และ lxml แต่ละ Library ก็มีข้อดีข้อเสียแตกต่างกันไป
พี่ว่า Beautiful Soup เหมาะสำหรับคนที่เริ่มต้น เพราะใช้งานง่ายและมี Documentation ที่ดี แต่ถ้าต้องการทำ Web Scraping ที่ซับซ้อนมากขึ้น หรือต้องการดึงข้อมูลจากเว็บไซต์ที่ใช้ JavaScript เยอะๆ อาจจะต้องลองใช้ Scrapy หรือ Selenium ดู
| Library | ข้อดี | ข้อเสีย | เหมาะสำหรับ |
|---|---|---|---|
| Beautiful Soup | ใช้งานง่าย, Documentation ดี | ช้า, ไม่รองรับ JavaScript | Web Scraping แบบง่ายๆ |
| Scrapy | เร็ว, รองรับ Web Scraping ที่ซับซ้อน | เรียนรู้ยากกว่า | Web Scraping ขนาดใหญ่ |
| Selenium | รองรับ JavaScript, สามารถจำลองการทำงานของ Browser ได้ | ช้า, ใช้ทรัพยากรเยอะ | Web Scraping จากเว็บไซต์ที่ใช้ JavaScript เยอะ |
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะ ถ้ามีคำถามอะไรเพิ่มเติม ถามพี่ได้เลย!
น้องๆ รู้ไหม สมัยผมทำร้านเน็ต SiamCafe เนี่ย ข้อมูลข่าวสารนี่สำคัญสุดๆ อยากรู้ราคาเกมใหม่, โปรโมชั่นร้านอื่น, หรือแม้แต่ข่าวลือในวงการเกม ต้องไว! Web scraping เลยเป็นเครื่องมือหากินของผมเลยแหละ
แต่ scraping ก็เหมือนดาบสองคมนะ ถ้าทำไม่ดี เว็บไซต์เค้าอาจจะแบน IP เราได้ หรือแย่กว่านั้นคือไปรบกวน Server เค้า ทำให้เว็บเค้าล่ม! ดังนั้น ต้องมีมารยาทในการ scraping ด้วยนะจ๊ะ
น้องๆ รู้จัก robots.txt ไหม? มันคือไฟล์ที่บอกว่าส่วนไหนของเว็บไซต์ที่เค้าอนุญาตให้ Bot เข้ามาเก็บข้อมูลได้ (และส่วนไหนที่ห้าม!) ลองเปิดดู robots.txt ของเว็บไซต์ที่เราจะ scrape ก่อนเสมอ จะได้ไม่ไปละเมิดสิทธิ์เค้านะ
วิธีดูก็ง่ายๆ แค่พิมพ์ URL ของเว็บไซต์ ตามด้วย "/robots.txt" เช่น https://www.example.com/robots.txt
อย่ารัว Request ไปที่เว็บไซต์เค้าถี่ๆ! คิดซะว่าเราไปขอข้อมูลเค้าฟรีๆ นะจ๊ะ ควรใส่ Delay เข้าไปใน Code เราบ้าง เช่น
import time
import requests
url = "https://www.example.com"
for i in range(5):
response = requests.get(url)
# do something with response.text
print(f"Request {i+1} successful")
time.sleep(2) # หน่วงเวลา 2 วินาที
สมัยผมทำร้านเน็ต เคยเจอเคสที่ Server ร้านโดนยิง DDOS เพราะมีคนทำ Bot มา scrape ข้อมูลที่เว็บร้านผม! กว่าจะแก้ได้แทบแย่ ดังนั้น อย่าทำแบบนั้นกับคนอื่นนะ!
บางเว็บไซต์ เค้าจะบล็อก Request ที่มาจาก Bot ที่ User-Agent เป็น Default ของ Python Requests ดังนั้น เราสามารถ "ปลอม" User-Agent ให้เป็น Browser ทั่วไปได้
import requests
url = "https://www.example.com"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
# do something with response.text
User-Agent หาได้จาก Google เลยจ้า พิมพ์ว่า "My User Agent" แล้ว Google จะบอกเราเอง
เวลา scrape ข้อมูล ต้องเตรียมรับมือกับ Error ที่อาจเกิดขึ้นด้วย เช่น Website ล่ม, Network Timeout, หรือ Data ที่เราต้องการไม่มีอยู่จริง ใช้ try...except เข้ามาช่วยได้เลย
import requests
from bs4 import BeautifulSoup
url = "https://www.example.com"
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
soup = BeautifulSoup(response.text, 'html.parser')
# do something with soup
except requests.exceptions.RequestException as e:
print(f"Error during request: {e}")
except Exception as e:
print(f"An error occurred: {e}")
อย่าลืมใส่ Timeout ด้วยนะ กันโปรแกรมเราค้างเติ่งเพราะรอ Response จาก Server นานเกินไป
A: ลองใช้ Proxy Server ดูสิ! มันจะช่วยเปลี่ยน IP Address ของเรา ทำให้เว็บไซต์คิดว่าเราเป็นคนใหม่
A: ได้! แต่ Beautiful Soup อาจจะไม่พอ ต้องใช้เครื่องมือที่ render JavaScript ได้ เช่น Selenium หรือ Puppeteer
A: ต้องดูเงื่อนไขการใช้งานของเว็บไซต์นั้นๆ ครับ บางเว็บไซต์เค้าห้าม scrape ข้อมูลเพื่อการค้า ถ้าฝ่าฝืน อาจโดนฟ้องได้นะ
A: ลองดู robots.txt ก่อนนะจ๊ะ แล้วอย่าลืมทำตาม Best Practices ที่ผมบอกด้วย!
Web Scraping เป็นเครื่องมือที่มีประโยชน์มากๆ แต่ต้องใช้อย่างระมัดระวัง เคารพสิทธิ์ของเจ้าของเว็บไซต์ และอย่าลืมใส่ใจเรื่อง Error Handling ด้วยนะจ๊ะ
ถ้าอยากอ่านเรื่องราวเกี่ยวกับเทคโนโลยี และชีวิตในร้านเน็ตสมัยก่อน ลองแวะไปที่ SiamCafe Blog ดูนะ