Data Crawling Using Google Script

สวัสดีท่านผู้อ่านอีกครั้งนะครับ ในวันนี้เราจะนำเสนอของฟรี (หรือไม่ฟรีก็ไม่แน่ใจ) ที่เจ๋งประมาณหนึ่งนั่นคือ Google Script ผมเคยลองใช้ให้ส่งเมล์ทุกวันแบบตั้งเวลาไว้ โดยแนบ Google Sheet จาก Google Drive ซึ่งคือ Daily Update ของโปรเจคหนึ่ง บอกเลยว่าผลออกมาดีเกินคาด ช่วยให้การทำงานซ้ำๆในทุกวันสนุกขึ้น

ซึ่งในวันนี้เราจะนำเสนอแนวทางการใช้งานที่กำลังน่าจะเป็นหัวข้อฮิตของช่วงนี้สำหรับ Big Data คือตอนนี้เราพูดถึงมันเยอะแต่ว่าคนทำจริงที่มีประสบการณ์มีน้อยเพราะมีข้อมูลสาธารณะให้วิเคราะห์น้อย พวกคนที่ยังไม่มีประสบการณ์ก็จำเป็นที่จะต้องหาฐานข้อมูลเหล่านั้นขึ้นมาเอง ซึ่งพอเป็นแบบนั้นเนี่ยส่วนใหญ่ก็จะนึกถึงต้องมีเครื่องที่ทำงานตลอดเวลาเพื่อดึงข้อมูลจากอินเตอร์เน็ต (หรือผมคิดคนเดียวก็ไม่รู้นะ) พอจะให้เปิดคอมทิ้งไว้ที่บ้านก็กล้วบ้านไฟตกบ้างหล่ะไฟใหม้บ้างละ จะเช่าเซิร์ฟเวอร์ก็แบบจนอ่ะนะ คืออยากมีประสบการณ์แต่ไม่ต้องเสียเงินมากอ่ะมีมั้ย (เพราะเงินเดือนมันน้อยตามประสบการณ์) บอกเลยฮะว่ามีแต่ต้องพยายามนิดนึง

วันนี้เราจะแสดงตัวอย่างการดึงข้อมูลจากฟีด (พาดหัวข่าว ในที่นี้ใช้ฟีดจากกรุงเทพธุรกิจ) แล้วมาเก็บไว้ใน Google Sheets โดยอย่างแรกเราต้องสร้าง Sheet และนำเอา id ของ Sheet นั้นๆ ออกมาก่อนโดยมันจะเป็นตัวเลขผสมตัวอักษรตรงแอดเดรสหลัง /d/ เพื่อสำหรับเขียนข้อมูลที่อ่านมาได้จากฟีดนั่นเอง จากนั้นก็เปลี่ยนชื่อของชีทที่เราทำงานอยู่ให้เป็น feed เพื่อให้ง่ายต่อการเรียกใช้

ฟีดที่เราได้มานั้นจะอยู่ในรูป XML เราจะใช้ XML Service ที่ Google มีให้มาใช้เพื่อช่วยอ่านค่าจาก XML (Google XML Service) จากนั้นก็บันทึกลงในชีท ส่วนเรื่องราวหลังจากนั้นก็แล้วแต่นักวิทยาศาสตร์ข้อมูลแล้วแหละว่าจะใช้ให้มีประโยชน์สูงสุดได้อย่างไร ส่วนโค้ดตัวอย่างอยู่ข้างล่างนี้ครับ (เพียงปรับ URL กับ Sheet ID ก็น่าจะทำงานได้นะฮะ)

function getFeed() {
  var sheet = SpreadsheetApp.openById('Sheet ID').getSheetByName('feed');

  var url = '-- Your Feed Link --';
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var items = document.getRootElement().getChild('channel').getChildren('item');

  Logger.log('Found %s items', items.length);
  for(var i=0; i < items.length; ++i) {
    var title = items[i].getChild('title').getValue();
    var description = items[i].getChild('description').getValue();
    var link = items[i].getChild('link').getValue();
    var pubDate = items[i].getChild('pubDate').getValue();
    
    sheet.appendRow([pubDate, title, description, link]);
    
    Logger.log(title);
  }
}

นอกจากนี้เนี่ยเรายังสามารถสร้าง trigger ให้ฟังก์ชันของเรานั้นทำงานทุกกี่ชั่วโมงกี่นาทีก็ได้แล้วแต่ แต่ต้องไม่เยอะจนทำให้เวปเดือดร้อนนะครับ ข้างล่างเป็นภาพของข้อมูลที่ทดลองดึงมาได้ครับ ขอให้ผู้อ่านทุกท่านโชคดี ติดปัญหาตรงไหนก็โพสถาม Stack Overflow ได้นะครับ หรือจะมาถามในโพสนี้ก็ได้ ขอบคุณที่ติดตามขอให้มีโอกาสหน้าที่จะได้มาเล่าเรื่องสู่กันฟังอีก วันนี้ต้องไปก่อน

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s