ในบทความนี้ ฉันจะแสดงให้คุณเห็นว่าคุณสามารถทำการขูดเว็บโดยใช้ Puppeteer และ Nodejs ได้อย่างไร ในการเริ่มต้น เราต้องทำความเข้าใจก่อนว่าการขูดเว็บคืออะไร และ Puppeteer สามารถช่วยให้เราทำเช่นนั้นได้อย่างไร

การขูดเว็บ

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

นักเชิดหุ่น

Puppeteer เป็นไลบรารี Nodejs แบบโอเพ่นซอร์สที่พัฒนาโดย Google มีพื้นฐานมาจากโครเมียม ซึ่งเป็นเวอร์ชันยอดนิยมของ Google Chrome Puppeteer ทำงานแบบไม่มีส่วนหัวตามค่าเริ่มต้น แต่สามารถกำหนดค่าให้ใช้งาน Chrome หรือ Chromium แบบเต็ม (ไม่มีส่วนหัว) ได้
ไม่เพียงช่วยให้เราทำการขูดเว็บเท่านั้น แต่เรายังสามารถทำอะไรได้มากกว่านั้นอีกด้วย ชอบ:

  1. การสร้างภาพหน้าจอของหน้าเว็บ
  2. กำลังสร้าง pdf
  3. การส่งแบบฟอร์มอัตโนมัติ การทดสอบ UI การป้อนข้อมูลด้วยแป้นพิมพ์ ฯลฯ

มาทำการขูดเว็บกันดีกว่า

ในการเริ่มต้น เราจำเป็นต้องมี Nodejs ในระบบของเรา หากคุณไม่มี Nodejs คุณสามารถติดตั้งได้โดยไปที่ เว็บไซต์อย่างเป็นทางการ
ตอนนี้ให้สร้างโฟลเดอร์และตั้งชื่อตามที่คุณต้องการ แล้วเปิดใน vscode เปิดเทอร์มินัลแล้วเขียนคำสั่งต่อไปนี้เพื่อเริ่มต้นโฟลเดอร์โปรเจ็กต์ด้วยไฟล์ package.json:

npm init -y

ตอนนี้สร้างไฟล์ index.js หลังจากนี้ ให้รันคำสั่งต่อไปนี้เพื่อติดตั้ง Puppeteer:

npm install --save puppeteer

การติดตั้งจะใช้เวลาสักครู่เนื่องจากจะติดตั้งโครเมียมด้วย ดังนั้นจงอดทน

สำหรับคำแนะนำเฉพาะนี้ เราจะแยก "หน้าเว็บนี้":

เพื่อให้ทุกอย่างง่ายขึ้น เราจะแยกเฉพาะชื่อเรื่องและบทสรุปจากหน้าเว็บนี้เท่านั้น ตอนนี้เปิดไฟล์ index.js แล้วทำตามขั้นตอนเหล่านี้:

ขั้นตอนที่ 1

ต้องการ Puppeteer เพื่อที่เราจะได้ใช้มัน

const puppeteer = require("puppeteer");

ขั้นตอนที่ 2

สร้างฟังก์ชัน async เพื่อให้เราสามารถใช้คีย์เวิร์ด await ได้ นี่เป็นเพราะนักเชิดหุ่นใช้คำสัญญา

async function scrap() {
}
scrap();

เราจะเขียนโค้ดที่เหลือในฟังก์ชันนี้

ขั้นตอนที่ 3

โทร puppeteer.launch() เพื่อเปิดเบราว์เซอร์

const browser = await puppeteer.launch();

ขั้นตอนที่ 4

เรียก browser.newPage() เพื่อสร้างอินสแตนซ์ของเพจ

const page = await browser.newPage();

ขั้นตอนที่ 5

โทรไปที่ page.goto() และระบุ URL ของหน้าเว็บที่เราต้องการทิ้งเป็นอาร์กิวเมนต์

await page.goto("https://www.imdb.com/title/tt1013752/");

ขั้นตอนที่ 6

โทรไปที่ page.evaluate() มันใช้ฟังก์ชันเป็นอาร์กิวเมนต์ ในฟังก์ชันนี้ เราสามารถเลือกองค์ประกอบใดก็ได้จากหน้าเว็บ ในกรณีของเรา เราจะเลือกชื่อเรื่องและข้อมูลสรุปจากหน้าเว็บนั้น
ไปที่ "หน้าเว็บ" นั้นแล้วเปิดเครื่องมือสำหรับนักพัฒนา คลิกที่เครื่องมือตรวจสอบ (ที่มุมซ้ายบน) จากนั้นคลิกที่ชื่อ

คลิกขวาที่องค์ประกอบที่ไฮไลต์บนแท็บองค์ประกอบ จากนั้นคลิกที่ "คัดลอก" จากนั้นคลิกที่ "ตัวเลือกการคัดลอก" เพื่อคัดลอกตัวเลือก CSS ในทำนองเดียวกัน คุณยังสามารถคัดลอกตัวเลือกของข้อมูลสรุปได้เช่นกัน ตอนนี้ให้ดูที่รหัสต่อไปนี้:

const data = await page.evaluate(() => {
   const title = document.querySelector("#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1").innerText;
   const summary = document.querySelector("#title-overview-widget > div.plot_summary_wrapper > div.plot_summary > div.summary_text").innerText;
   return {
     title,
     summary
   }
});

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

ตอนนี้เมื่อเราดึงข้อมูลสำเร็จแล้ว เราก็สามารถทำอะไรกับมันได้ เราสามารถจัดเก็บไว้ในไฟล์ CSV หรือใช้เป็น API ได้

ขั้นตอนสุดท้าย

โทร browser.close() เพื่อปิดเบราว์เซอร์

await browser.close();

ในการรันไฟล์ index.js ให้เขียนคำสั่งต่อไปนี้ในเทอร์มินัล:

node index.js

นี่คือลักษณะของโค้ดของเรา:

const puppeteer = require("puppeteer");
async function scrap() {
  // Launch the browser
  const browser = await puppeteer.launch();
  // Create an instance of the page
  const page = await browser.newPage();
  // Go to the web page that we want to scrap
  await page.goto("https://www.imdb.com/title/tt1013752/");
  // Here we can select elements from the web page
  const data = await page.evaluate(() => {
    const title = document.querySelector(
      "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"
    ).innerText;
    const summary = document.querySelector(
      "#title-overview-widget > div.plot_summary_wrapper > div.plot_summary > div.summary_text"
    ).innerText;
    // This object will be stored in the data variable
    return {
      title,
      summary,
    };
  });
  // Here we can do anything with this data
  // We close the browser
  await browser.close();
}
scrap();

บทสรุป

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

หากคุณต้องการเชื่อมต่อกับฉัน ติดตามฉันได้ที่ twitter