มาเข้าใจภาพรวมการทำ Web scraping กันเถอะ !!

Punsiri Boonyakiat
5 min readJan 19, 2021

--

ในบทความนี้จะพูดถึงการทำ Web scraping หรือภาษาทางการเรียกว่าการสกัดและดึงข้อมูลจากเว็บไซต์ ซึ่งหลายๆคนคงได้ยินและคุ้นๆกันบ้าง

แต่เราอยากจะมาเล่าภาพรวมให้ครอบคลุมครบวงจรการทำ web scraping ตั้งแต่ดึงข้อมูลแบบธรรมดาสั้นๆ ไปถึงการ spin VM นับสิบๆ ตัว เพื่อร่วมด้วยช่วยกันดึงข้อมูล มีการ monitor การทำงานของ scraper

พื้นฐาน และภามพรวม

Web Analysis หาแพทเทิร์ข้อมูลให้เจอ

Web scraping คืออะไร?

Fig 1. การสกัดข้อมูลจากเว็บไซต์

อย่างที่ทุกคนทราบกันดีว่า internet คืออีกหนึ่งขุมทรัพย์ข้อมูล และการที่จะได้มาก็คือการทำ web data extraction หรือที่เขาเรียกกันว่า web scraping นั้นเอง โดยศัพท์ คำว่า “scraping” นั้นแปลว่า การขูด. ซึ่งในบทความนี้อาจจะใช้คำว่า ดูด ดึง แงะ ข้อมูลค่ะ โดย web scraping มีตั้งแต่ manual scale ไปถึง automation scale เลย เนื่องจากว่าในบางครั้งข้อมูลที่มีนับหมื่นนับล้าน นั้นทำให้เราไม่สามารถ ค่อยๆเขียน และ แงะ (retrieve) ทีละหน้าๆได้ ดังนั้นจึงต้องมีการวางแผน และสร้างระบบอัตโนมัติขึ้นมาดูดข้อมูลแทนเราคะ

Web scraping ไปทำไม ?

ปัจจุบันมีการนำข้อมูลที่ได้จากเว็บไซต์ไปใช้หลายรูปแบบ ตัวอย่างเช่น

Fig 2. Web scraping data sources.
  1. Data monitoring — เพื่อติดตามการเปลี่ยนแปลงของข้อมูลในแต่ละช่วงเวลา เช่น ติดตามราคาหุ้น, จำนวนสินค้า/ยอดขายของเว็บไซต์คู่แข่ง, เทรนด์ของสินค้าในตลาดออนไลน์, หรือข่าวสาร
  2. Alternative data source for decision making — เพื่อใช้เป็นแหล่งข้อมูลเสริมในการทำ model หรือวิเคราะห์เพื่อช่วยในการตัดสินใจควบคู่ไปกับข้อมูลที่มีภายในองค์กร (internal data)
  3. Sentiment analysis & market research — เพื่อดึงข้อมูลความคิดเห็นของลูกค้าไปใช้ในการวิเคราะห์ ทำความเข้าใจสิ่งที่ลูกค้าพูดถึงผลิตภัณฑ์และบริการของเราบน social media เพื่อประกอบในการออก campaign หรือทำ product research

เข้าใจพื้นฐานการทำงานของ Website

Fig 3. การทำงานของเว็บไซต์

ก่อนจะลงมือทำต้องเข้าใจการทำงานเบื้องต้นของเว็บก่อน !!

  1. เมื่อเรา (user) เปิดเว็บไซต์ เราต้องพิมพ์ที่อยู่ของเว็บ (URL)
  2. หลังจากที่พิมพ์ชื่อเว็บแล้วเรากด enter ปุ๊ป เครื่องเราก็ทำการยิง request ไปที่ server จริงๆแล้วจุดนี้เครื่องของเรา (client) กำลังคุยกับ server เพื่อขอข้อมูลมาแสดงผลที่หน้าจอ ผ่าน Hypertext Transfer Protocol (HTTP) ซึ่งเป็นโปรโตคอลที่ใช้ส่ง/เผยแพร่ข้อมูล และทำให้เครื่องคอมพิวเตอร์สามารถสื่อการกันได้ โดยการเข้าเว็บ 1 ครั้งก็จะเกิดการส่งหลายๆ requests พร้อมๆกัน เพื่อข้อมูลมาแสดงผล โดยจะมี Request Method หรือวิธีการขอข้อมูลหลักๆสองแบบคือ GET/POST
  3. เมื่อ server ได้รับ request ก็จะรันโปรแกรมเพื่อประมวลผล และส่ง response กลับไปยัง client หรือคอมพิวเตอร์ของเรา และเมื่อ server ตอบกลับมาก็ส่ง sources หลายไฟล์ กลับมาด้วย พร้อม status code เช่น 200=คุยกันราบรื่น, 404 =ที่เราขอไปเขาหาไม่เจอ, 500=server มีปัญหา
Fig 4. องค์ประกอบของเว็บไซต์

4. เมื่อ response ถูกส่งกลับมา client ก็จะนำ source files มารวมร่างและแสดงผลเป็นเว็บที่มีทั้งข้อมูล, ฟังก์ชั่น, และหน้าตาที่สวยงามโ ดย sources ที่ server ส่งกลับมาจะและประกอบเว็บไซต์แสดงผล ซึ่งข้อมูลที่เราต้องการจะดูดก็จะอยู่ใน sources เหล่านี้นี้เอง ค่ะ

ขั้นตอนพื้นฐานในการทำ Web Scraping

Fig 4. Build scraper.

หากอ่านมาถึงตรงนี้ จะพบว่าจริงๆแล้วการทำ web scraping คือการที่เราจะเขียนบอต (scraper) ขึ้นมาตัวนึงเพื่อให้มันทำหน้าที่ไปเอาข้อมูลแทนเรา (เทียบกับ Fig 3.) โดยบอตจะทำขั้นตอนต่อไปนี้แทนเรา

  • Enter website — เข้าไปยังเว็บไซต์เป้าหมาย
  • Collect source — เก็บ raw data source กลับมาเช่น html /json
  • Extract data — ดึงข้อมูลที่ต้องการจาก raw data
  • Clean data — จัดการข้อมูลให้อยู่ในรูปแบบที่พร้อมใช้งาน
  • Load data — จัดเก็บข้อมูลให้เหมาะสม

เฉกเช่นเดียวกันกับทุกๆ การทำ​ software development การทำ web scraping ที่ดี ก็ควรมีขั้นตอนการทำงานที่ดีเช่นกัน เพื่อให้การทำงานราบลื่น ดังนั้นขั้นตอนพื้นฐานของการทำ web scraping จึงมีดังนี้

  1. Requirement analysis — จะเอาข้อมูลไปใช้ทำอะไรเพื่ออะไร และมีเว็บไหนเป็นเว็บเป้าหมายบ้าง เว็บที่จะดึงข้อมูลมีข้อมูลที่ตอบโจทย์ปัญหาจริงหรือไม่
  2. Website analysis — เนื่องจากแต่ละเว็บก็ถูกสร้างมาด้วยภาษาและเครื่องมือที่แตกต่างกัน ดังนั้นก่อนลงมือ scrape จะต้องตรวจสอบ (inspect) เสมอว่าข้อมูลที่เราต้องการอยู่ในส่วนไหนของเว็บ
  3. Build scraper — เขียนโค้ดที่ทุกคนชอบ :) โดยการเขียน scraper ขึ้นมาสามารถ เขียนได้หลากหลายภาษาทั้ง python, nodejs, go, java หรือแม้แต่ shell command ซึ่งถ้าเราทำข้อ 2. มาดีเราก็จะ code ได้ง่ายมาก
  4. Scale up — มันคืออการเอา scraper ของเราขึ้นรันบน production เพื่อให้มี VM หลายๆตัวมาช่วยกันดึง (กรณีข้อมูลจำนวนมาก) โดยส่วนตัวผู้เขียนจะใช้ docker เข้ามาช่วยเพื่อทำให้การสั่ง deploy scraper ในหลายๆเครื่องทำได้ง่ายขึ้น
  5. Scaling up challenge— ตรวจสอบความสามารถในการรับมือของแต่ละ website ในเรื่องของการป้องกัน (IP Blocking, Captcha) และการรับโหลด เนื่องจากบางเว็บไม่สามารถทนต่อการยิงรัวๆ (flooding) ของเราได้ หรือบางเว็บก็มีตัว monitor ที่ถ้าเรายิงอย่างหนังหน่วงเกินไปอาจจะโดนบล๊อกไปเลย T.T
  6. Monitoring— สำคัญมากคือการ monitor ว่ามีจุดไหน เก็บไม่หมด พัง หรือต้องซ่อม เพราะฉะนั้นเวลาที่เขียน code จึงต้องเขียน loging pattern ที่ทำให้สามารถ track การทำงานของ scraper ได้ง่ายๆ โดยส่วนตัวเราชอบของ Google cloud platform เพราะ มี Logging metrics ที่ทำให้เราวัดผลการทำงานได้ แถมตั้ง​ alert ได้อีกถ้า scraper หยุดทำงาน​ :)

ETL VS. ELT ในการทำ Web scraping

ว่าด้วยการทำ Web scraping แล้วจะไม่พูดถึง ETL และ ELT ก็ไม่ได้เพราะ มันคือของคู่กันเลย !!

ETL/ELT ย่อมาจาก Extract, Transform and Load มันคือกระบวนการรวบรวมข้อมูลที่ Data Engineer ทุกคนรู้จักเป็นอย่างดี ถ้าย้อนกลับไปอ่า step web scraping ที่แนะนำข้างบน จะเห็นได้ว่า เราแนะนำ คือ ELT

ถึงแม้ว่าการทำ ELT จะต้องแลกมากับการที่ต้องเก็บข้อมูลขนาดใหญ่กว่ามากแต่จากประสบการ์ณ เราพบว่า มันมีข้อดีที่เหมาะกับ data scraping ดังนี้

  1. Scraper fail — กรณีที่ Scraper ตายกลางทางถ้าเป็นแบบ ELT เราสามารถย้อนกลับมาซ่อมได้ง่ายกว่า ไม่ต้อง run ใหม่ทั้งหมด แค่ extract/load ใหม่เฉพาะจุดที่มีปัญหา
  2. Unable to extract/transform data on the fly — เราไม่ต้องเสี่ยงกับการที Scraper ตาย เพราะการ try catch ไม่ครบในกรณีที่ เราต้องการจะดึงข้อมูลที่มันดันไม่มีในบางหน้า
  3. Data backup — เรามี raw data source ที่สามารถไป ดึงข้อได้โดยที่ไม่ต้องไปยิงใหม่ถ้าข้อมูลไม่ครบ แถม raw data source ยังใช้ในการ referernce หรือ cross check กับบน Data warehouse ในกรณีที่เจอเคส outliner แปลกๆ ได้อีก

หาแพทเทริน์ให้เจอ?!

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

โดย pattern ที่ปกตเราใช้ในการวิเคราะห์เว็บก่อน scrape จะมีดังนี้

  1. URL pattern
  2. Data representation pattern
  3. Web pattern
  4. DOM pattern

URL Patterns
การทำความเข้าใจรูปแบบของ URL ของแต่ละเว็บก็สำคัญและเป็นอันดับแรกๆที่เราจะจับ pattern ได้ เพราะข้อมูลไม่ได้อยู่แค่หน้าเดียว และะโดยส่วนใหญ่เว็บก็ออกแบบมาให้เราเรียก ผ่าน pattern ของ URL โดย URL จะประกอบด้วย

  • Protocol — HTTP/HTTPS
  • Domain name — ชื่อเว็บ
  • Resource path — path ที่ server เป็นคนระบุสำหรับแต่ละ services
  • Query — ตัวแปล และ ค่าที่เอาไว้ค้นหาข้อมูล
Fig 4. โครงสร้างของ URL

วิธีการดู ULR patterns

ให้ลองคลิกๆดูข้อมูล แล้วดูว่า URL หน้านั้นเปลี่ยนไปยังไง เช่น …

1. Resource path

เจอแบบนี้เราก็วนเขียนวนลูปที่ path เปลี่นย เลข topic ได้เลย

https://test.com/topic/1
https://test.com/topic/2
https://test.com/topic/3

2. Paginations

เจอแบบนี้เราก็วนเขียนวนลูปที่ query เปลี่นยเลข order ได้เลย

https://test.com?order=1
https://test.com?order=2
https://test.com?order=3

3. Categorical

เจอแบบนี้เราก็วนเขียนวนลูปที่ query เปลี่นย categorical ได้เลย

https://test.com?product_cat=beauty
https://test.com?product_cat=toys
https://test.com?product_cat=cooking

Data Representation Pattern

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

Fig 5. Identify Data Pattern

Web patterns

เราสามารถระบุรูปแบบของเว็บ ได้ 2 รูปแบบซึ่งก็จะมีวิธีดึงที่แตกต่างกันค่ะ

1. Static web

  • ข้อมูลจะอยู่ใน HTML หรือ JavaScript วิธีการจัดการกับเว็บพวกนี้คือ DOM Parsing ซึ่งต้องทำความเข้าใจ Pattern ของข้อมูลที่อยู่ใน HTML elements ซึ่งแต่ละ web ก็มีโครงสร้างไม่เหมือนกัน
  • Tools: Selenium, BeautifulSoup

2. Dynamic web

  • ข้อมูลจะอยู่ใน XHR object (XML/JSON) หรือจะบอกว่าข้อมูลถูกส่งมาผ่าน API แล้วโดน Javascript/AJAX render ขึ้นมา ถ้าเจออันนี้คือขุมทรัพย์เลยค่ะ เพราะเราสามารถปลอม User Agent และ ยิง request ขอข้อมูลได้เลย
  • Tools: Request, wget, curl

DOM Patterns

สำหรับทุกเว็บ จะแสดงผลด้วย HTML ถ้าเราระบุ DOM (Document Object Model) หรือ HTML Page Structure เจอการดึงข้อมูลก็จะง่ายขึ้น ยกตัวอย่าง DOM ข้างล่างง่ายๆ คือจะเห็นว่า ข้อมูลของเรา สองตัวอยู่ใน <p class=’x’> โดยวิธีดูคือ ให้ดู HTML element เช่น tag, class, id, attribute

Fig 6. Identify DOM pattern

สรุปความท้าทายของการดูดข้อมูล!!

สุดท้ายก่อนปิดบทความนี้ แล้วไปเริ่ม coding กันจริงจัง อยากพูกถึงความตื่นเต้นท้าทาย หรือ ความสนุกที่เราคิดว่าได้จากการดูดข้อมูล

  • Difference web, difference structured — การ scraping ทุกครั้งจะรู้สึกเหมือนตัวเองเป็นนักสืบ เพราะแต่ละเว็ปก็หน้าตาไม่เหมือนกัน โครงสร้างไม่เหมือนกัน และเวลาเจอเว็บที่เราคิดว่าวิธีการออกแบบของเขาเจ๋ง
  • Web page changing — หลายครั้งเว็บมีการเปลี่ยนแปลงตลอด Script ที่เราเคยเขียน ปีนี้ ผ่านไปเอามารันก็อาจจะใช้ไม่ได้แล้วต้องไปสืบกันใหม่
  • API Availability — ข้อนี้ชอบมากๆ ในหลายๆครั้งที่เว็บเขามี API ให้ยิง เรายิง API ตรงง่ายกว่าเยอะ คหสต. เราคิดว่าหลายคนยังเข้าใจผิดอยู่ว่า web scraping ต้อง selenium อย่างเดียว ซึ่งพอไปวิธีนั้นทั้งๆที่เขามี API กลายเป็นว่าต้องเขียน code ถึกๆ ทั้งที่จริงๆ อาจจะแค่ ไม่กี่บรรทัดจบเลย!!
  • Do Not Flood, IP Blocking — อย่ายิงรัวๆไป เพราะเราไม่อยากทำเว็ปใครล่ม และ ไม่อยากโดนบล๊อกด้วย ยิงแต่พองาม และใช้ Rotating Proxy, Inject Cookies หรือ Switch user Agent มาช่วย

Reference

--

--

Punsiri Boonyakiat
Punsiri Boonyakiat

Written by Punsiri Boonyakiat

Senior Data Engineer | Google Cloud Certified Professional Data Engineer| Traveller | A Mom | Learner

No responses yet