Web Scraping with R specphone

Web Scraping ดึงข้อมูลจากเว็บไซต์ ง่ายๆด้วย R

บทความนี้แอดมาสอนการดึงข้อมูลจากเว็บไซต์ หรือการทำ web scraping กับหน้าเว็บไซต์ static ง่ายๆ เช่น wikipedia, IMDb, เว็บไซต์ข้อมูลทั่วๆไป เป็นต้น

ตัวอย่างโค้ดแอดสอนด้วย R เพื่อนๆสามารถทำตามบน RStudio Cloud ได้เลย

Table of Contents

What is Web Scraping

Web scraping คือการดึงข้อมูลจากเว็บไซต์ (data extraction) เพื่อสร้าง datasets สำหรับใช้ในงานอื่นๆต่อไป โดยขั้นตอนการดึงข้อมูลจริงๆไม่มีอะไรเลยสำหรับ static websites

  • ดาวน์โหลด source (html, css, javascript) จากเว็บไซต์
  • ดึง nodes (HTML elements) ที่เราต้องการ
  • รวมข้อมูลที่เราดึงออกมาเป็น data frame

Web scraping refers to the extraction of data from a website. This information is collected and then exported into a format that is more useful for the user

Parsehub.com

✅ ความรู้พื้นฐานที่ควรมีก่อนเริ่มทำ web data harvesting คือ basic HTML, CSS และ JavaScript is a plus แอดแนะนำลองรีวิว concepts สำคัญๆได้ที่ W3schools

ถ้าใครยังไม่เคยใช้ RStudio Cloud สามารถสมัคร free account และสร้าง new project รอไว้ได้เลย ด้านล่างเป็นตัวอย่าง code ทั้งหมดที่เราจะเขียนวันนี้ ไม่ถึง 20 บรรทัด

Rstudio cloud interface
RStudio Cloud Interface

Introducing rvest

R มี package ชื่อ rvest สำหรับดึงข้อมูลจาก static website พัฒนาโดย Hadley Wickham Chief data scientist ที่ RStudio/ Posit

มาลองดาวน์โหลดและเรียกใช้งาน packages กันก่อน โดยแอดใช้ tidyverse เพื่อ prep data และ rvest สำหรับ web scraping

install.packages(c("tidyverse", "rvest"))
library(tidyverse)
library(rvest)

เว็บไซต์ที่เราจะ scrape วันนี้ชื่อ SpecPhone โดยเราจะเข้าไปที่หน้า Samsung Galaxy S22 และดึง specs ของโทรศัพท์รุ่นนี้ออกมา เช่น ชื่อแบรนด์ cpu ram กล้อง วันเปิดตัว เป็นต้น

url <- "https://specphone.com/Samsung-Galaxy-S22.html"
web <- read_html(url)

✅ เราใช้ฟังก์ชัน read_html() เพื่ออ่านไฟล์ html บนเว็บ SpecPhone

หน้าเว็บไซต์ specphone ที่เราจะ scrape
Specphone website

Step ถัดไปคือการค้นหา node/ element ที่เราต้องการจะดึงข้อมูล

  • วิธีการดู source HTML ของหน้า web page ให้เราคลิกขวาบนหน้าจอเลือก inspect
  • Web browser ที่เราแนะนำคือ Google Chrome/ Microsoft Edge/ Firefox นะครับ 😊
คลิกขวาเลือก inspect เพื่อดู source บนหน้าเว็บนั้น
คลิกขวา เลือก inspect เพื่อดู HTML source code

คลิกที่ element ที่เราต้องการบนหน้าเว็บไซต์เพื่อดูชื่อ tag หรือ class สำหรับใช้ในขั้นตอน scrape ความยากง่ายของการดึงข้อมูลจะอยู่ที่ขั้นตอนนี้ ส่วนใหญ่เว็บ static จะมีโครงสร้างไม่ซับซ้อน จะหา tag ได้ง่ายกว่าเว็บแบบ dynamic/ interactive

Inspect หน้า web page เพื่อหา elements ที่เราต้องการดึงออกมา
Inspect source ของหน้า web page

พอเรารู้แล้วว่าข้อมูลที่เราต้องการอยู่ที่ HTML tags อะไร ก็เขียน R เพื่อดึงข้อมูลได้เลย เราใช้ฟังก์ชัน html_nodes() เพื่อดึง elements เสร็จแล้วใช้ html_text() เพื่อดึง content หรือ text

  • key อยู่ที่ div.topic
  • value อยู่ที่ div.detail

div คือชื่อ tag ที่เราต้องการ ส่วน .topic/ .detail เป็น class ของ tag นั้น

topics <- web %>%
  html_nodes("div.topic") %>%
  html_text()

details <- web %>%
  html_nodes("div.detail") %>%
  html_text()

ประกอบร่างตัว topics และ details เป็น Data Frame

df <- data.frame(topics, details)
View(df)

เสร็จแล้ว ง่ายเหลือเชื่อ 555+ โค้ดแค่ไม่กี่บรรทัดได้ข้อมูลไปทำ data analysis ต่อได้เลย

Data Frame เก็บข้อมูลที่เรา scrape ออกมาจากเว็บไซต์ specphone
Data Frame ที่ได้จากการทำ web scraping

Full R Script

✅ ถ้าเราสร้าง list ของหน้า web pages ที่ต้องการ scrape มาเก็บใน R ก็ใช้ for-loop เพื่อดึงข้อมูลทีละหน้า แล้วค่อยประกอบร่างเป็น dataframe ทีหลังก็ได้ สบายๆ

library(tidyverse)
library(rvest)
url <- "https://specphone.com/Samsung-Galaxy-S22.html"
web <- read_html(url)
topics <- web %>%
html_nodes("div.topic") %>%
html_text()
details <- web %>%
html_nodes("div.detail") %>%
html_text()
df <- data.frame(topics, details)
View(df)

R เป็นภาษาที่ทรงพลังมากสำหรับงาน data science ตัวอย่าง tasks ที่ R ทำได้เช่น

  • Web Data Extraction
  • Data Transformation
  • Data Visualization
  • Statistics & Machine Learning
  • Web Application & API

ถ้าใครสนใจเรียนเพิ่มเติม ลองดูคอร์สฟรี 30-Minute R หรือเรียนบน YouTube ของเราได้เลยนะครับ 😊

Leave a Reply