สอนทำ Web Scraping ด้วย Python เพื่อดึงข้อมูลจากเว็บไซต์

   By: Withoutcoffee Icantbedev

   อัปเดตล่าสุด June 25, 2023

สอนทำ Web Scraping ด้วย Python เพื่อดึงข้อมูลจากเว็บไซต์

ต้องการดึงข้อมูลจากหน้าเว็บไซต์ต่าง ๆ แบบอัตโนมัติโดยที่ไม่ต้อง copy/paste แบบ manual ซึ่งกว่าจะทำเสร็จก็ใช้เวลานานมาก ? เพื่อลดงานในส่วนนี้ หรือไม่ว่าจะเป็นเว็บนั้น ๆ ไม่มี API มาให้ใช้เพื่อให้เราดึงข้อมูล ดังนั้นจึงมีวิธีการหนึ่งในทางโปรแกรมมิ่งที่เราสามารถทำได้ เราจะเรียกเทคนิคนี้ว่า "การทำ Web Scraping" 


Web Scraping คืออะไร?

Web Scraping คือ วิธีการในการดึงหรือสกัดเอาข้อมูลจากเว็บไซต์ต่าง ๆ ด้วยการใช้ซอฟต์แวร์ในการ scrape ข้อมูล หรือไม่ว่าจะเป็นการเขียนโปรแกรมด้วยภาษา Scripting Language อย่างภาษา Python เพื่อดึงข้อมูลเหล่านั้นมา โดยหน้าเว็บที่เราจะทำ web scraping ต้องเป็น public data อนุญาตให้เราสามารถดึงข้อมูลได้ 


Web Scraping ผิดกฎหมาย?

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

  • เว็บไซต์ที่มีข้อกำหนดในการให้บริการ (Terms and Services) ที่ห้ามดึงข้อมูลจากเว็บอย่างชัดเจน (คือห้ามมา scrape หน้าเว็บฉันนะ เออถ้าแบบนี้คือชัดเจนเลยแฮะ)
  • เว็บไซต์ที่ใช้ CAPTCHA (ชัดเจนครับว่าเว็บนี้ต้องป้องกัน bot หรือระบบ automation)
  • เว็บไซต์ที่เราต้องทำการยืนยันตัวตน (Authentication System) พูดง่าย ๆ ก็คือเว็บที่เราต้องทำการล็อกอินเพื่อเข้าใช้งาน

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


เริ่มต้นทำ Web Scraping ด้วย Python

ต่อมาเราก็จะมาเริ่มทำ Web Scraping กันแล้วครับด้วยภาษาที่นิยมที่สุดคือ Python โดยสเต็ปแรกต้องติดตั้งไลบรารี่และเครื่องมือที่จำเป็นอยู่ 2 ตัว รวมไปถึง IDE ในการเขียนโค้ดดังต่อไปนี้

  • Requests ไลบรารี่
  • BeautifulSoup4 ไลบรารี่
  • PyCharm IDE สำหรับเขียนโค้ด

Note:  เพื่อน ๆ สามารถเลือกเครื่องมือเขียนโค้ดได้ตามใจชอบ เช่น VS Code, Sublime Text, Jupyter Notebook, ฯลฯ แต่ในบทความนี้ผมใช้ PyCharm ครับ 


รู้จัก BeautifulSoup4 และ Requests

BeautifulSoup4 คือ ไลบรารี่ที่เราจะใช้จัดการกับ HTML Elements และ Attributes ต่าง ๆ ที่เราได้ไป scrape มาในแต่ละหน้าเว็บ ซึ่งจะจัดการส่วนต่าง ๆ ให้เราหมดเลยครับ 

Requests คือ ไลบรารี่สำหรับเรียกใช้งาน HTTP Methods ต่าง ๆ ไม่ว่าจะเป็น GET, POST, PUT, DELETE เป็นต้น ซึ่งเป็นหลักการพื้นฐานของเว็บ


ติดตั้ง BeautifulSoup

ทำการติดตั้ง BeautifulSoup4  ด้วยคำสั่ง

pip install beautifulsoup4


ติดตั้ง requests

ทำการติดตั้ง requests ด้วยคำสั่ง

pip install requests


เช็คว่าไลบรารี่ติดตั้งสำเร็จเรียบร้อยดีหรือไม่

pip freeze


ไลบรารี่ทั้ง beautifulsoup4 และ requests ถูกติดตั้งเรียบร้อยดีไม่มีปัญหา (แต่ก็จะมี libs ตัวอื่นปนมาด้วยบางส่วน ไม่ใช่ปัญหาครับ)

beautifulsoup4==4.12.0
certifi==2022.12.7
charset-normalizer==3.1.0
idna==3.4
requests==2.28.2
soupsieve==2.4
urllib3==1.26.15


1. อิมพอร์ตไลบรารี่ที่เกี่ยวข้อง

import requests
from bs4 import BeautifulSoup


2. กำหนด URL ของเว็บที่เราจะสกัด (Scrape) เอาข้อมูล

url = "https://devhub.in.th/"


3. ส่ง GET request เพื่อดึงข้อมูลจากตัวแปร  url  ที่กำหนดเว็บไซต์ devhub.in.th ไว้ก่อนหน้า

response = requests.get(url)


4. เมื่อได้ elements ทั้งหมดของหน้าเว็บเพจมาแล้ว ก็จะใช้ฟังก์ชัน   BeautifulSoup()   เพื่อสกัดเอาข้อมูลทั้งหมดออกมา เพื่อที่เราจะสามารถเข้าถึงข้อมูลเหล่านั้นด้วย HTML Tags ได้ในขั้นตอนต่อไป

soup = BeautifulSoup(response.content, "html.parser")


5. ทดสอบแสดงผลข้อมูลที่เราต้องการจะสกัดออกมาด้วยคำสั่ง  print()  แบบตรงไปตรงมาเลยครับ โดยในที่นี้จะเป็นการเข้าถึง Title (ซึ่งโดยปกติก็จะเป็นแท็ก H1 element) จากนั้นแสดงผลข้อมูลของแท็กนั้นออกมาได้คำสั่ง  .string 

print(soup.title.string)


ตัวอย่างโค้ดฉบับเต็ม

# ขั้นตอนการอิมพอร์ตไลบรารี่ที่เกี่ยวข้อง
import requests
from bs4 import BeautifulSoup

# ขั้นตอนการโปรเซสและ scrape ข้อมูลจากเว็บไซต์ที่ต้องการ
url = "https://devhub.in.th/" # Target URL (website)
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")

# ขั้นตอนการแสดงผล
print(soup.title.string)


ผลลัพธ์

DH - Programming Resources for Thai Programmers


จะเห็นว่าตอนนี้เราสามารถดึง Title ของเว็บไซต์ devhub.in.th มาแสดงผลได้แล้ว ด้วยคำสั่ง

print(soup.title.string) # เข้าถึง Title




เราอยากเข้าถึง Elements หรือ Attributes ตัวไหนของ HTML ก็สามารถกำหนดได้ตามต้องครับ ไม่ว่าจะเป็น h2, h3, p หรือแท็กอื่น ๆ เป็นต้น เลือกใช้ตามการใช้งานได้เลย เราสามารถนำแนวคิดนี้ไปต่อยอดในระดับสูงขึ้นได้ครับ


หน้าเว็บที่ต้อง Login หรือ Authen?

หลายคนน่าจะสงสัยว่า แล้วหน้าเว็บที่ต้องล็อกอินหรือมีระบบ authentication ผู้ใช้ก่อนล่ะ เราจะสามารถทำ web scraping ได้ไหม หรือถ้าทำได้จะมีวิธีการทำอย่างไร เดี๋ยวผมจะมาเขียนส่วนนี้ต่อครับ กดติดตามหรือ bookmark หน้าเว็บไว้ก่อนได้


ถ้าชื่นชอบบทความนี้ก็คอมเมนต์เพื่อซัพพอร์ตเราได้ที่ Web Scraping Facebook post นี้ได้เลย และสามารถแชร์ออกไปให้เพื่อนของเราได้อ่านด้วยครับ


จ้างโปรแกรมเมอร์หรือนักพัฒนาสำหรับโปรเจคท์ด้าน Software Development เช่น Website, Web App, Mobile App หรือสอนโค้ดดิ้งตัวต่อตัว?

ติดต่อเรา