Crawl website sử dụng Node.js và Puppeteer – phần 1

Nội dung bài viết này mình sẽ giới thiệu cho những bạn craw tài liệu của web site sử dụng nodejs và Puppeteer.

Pupperteer là gì?

Puppeteer là một thư viện của Node cung cấp API cấp cao để kiểm soát Chrome hoặc Chromium sử dụng giao thức DevTools. Puppeteer mặc định chạy headless, nhưng có thể được định cấu hình để chạy non-headless.

Các chúng ta có thể tham khảo rõ ràng và cụ thể ở đây: https://viblo.asia/p/nghich-ngom-voi-puppeteer-Qbq5Q3j4ZD8

Một số lệnh hay dùng nhất của Puppeteer

Sau đây mình sẽ giới thiệu một số lệnh hay dùng nhất lúc sử dụng Puppeteer để crawler tài liệu. Những lệnh này là những lệnh hữu dụng và hay dùng nhất trong crawl data. bạn phải ghi nhớ để sở hữu thể đọc hiểu được code những phần tiếp theo nhé.

page.newPage()

mở một tab mới của trình duyệt

let page = await browser.newPage();

page.goto

đi đến một website

await page.goto(‘https://viblo.asia/’);

page.setExtraHTTPHeaders

set header cho trình duyệt:

await page.setExtraHTTPHeaders({ ‘Accept-Language’: ‘en-GB,en-US;q=0.9,en;q=0.8’ });

page.setUserAgent

set agent cho trình duyệt

await page.setUserAgent(‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36’);

page.setViewport

set độ rộng cho browser

await page.setViewport({width: 1500, height: 1500});

page.type

tự enter tài liệu vào trong 1 ô input

await page.type(“input[name=’email’]”, ‘viblo@gmail.com’, {delay: 100});

page.click

Click vào 1 chỗ bất kỳ (buton, link, input …)

page.click(“input[type=’submit’]”); await page.click(‘span[data-hook=”ryp-review-submit-button”]’);

page.waitFor

để trình duyệt load hoặc mong chờ một khoảng chừng thời kì

page.waitFor(7000);

page.waitForSelecto

Đợi một element xuất hiện, ví dự bạn muốn đợi có button login xuất hiện

await page.waitForSelector(‘#continue’);

page.evaluate

được chấp nhận bạn thực hiện những câu lệnh js trên browser

let captcha = await page.evaluate(() => { return document.getElementById(‘auth-captcha-image-container’); });

page.$eval

Mình thấy nó khá giống với lệnh evaluate ở trên

const stockAvailable = await newPage.$eval(‘.instock.availability’, text => r);

kiểm tra xem có id là auth-captcha-image-container không

await page.evaluate(() => { const reviewLists = document.querySelectorAll(“.ryp__star__button”); reviewLists.forEach(async (review, i) => { let j = i + 1; if (j % 5 === 0) { reviewLists[i].click(); } }); });

hay là sử dụng forEach lấy tài liệu browser rồi đặt tất cả và một list

browser.close();

đóng browser khi đã hoàn thành xong tất cả những task, bạn lưu ý hãy nhờ rằng lệnh này, nếu không browser sẽ luôn luôn được mở mới, sẽ cực kỳ tốn ram của mạng lưới hệ thống nhé bạn.

await browser.close();

Sẵn sàng chuẩn bị

Giả sử bạn đã cấu hình thiết lập nodejs trên máy tính của bạn

Setup project

Tạo một thư mục project:

mkdir book-scraper cd book-scraper

Khởi tạo npm init trong project của bạn để điền một số thành phần như tên, version …

Sau khoản thời gian khởi tạo các bạn sẽ có một file package.json có nội dung kiểu thế này, chúng ta có thể tùy chỉnh name, desciption …

{ “name”: “sammy_scraper”, “version”: “1.0.0”, “description”: “a web scraper”, “main”: “index.js”, “scripts”: { “test”: “echo “Error: no test specified” && exit 1″ }, “keywords”: [], “author”: “sammy the shark”, “license”: “ISC” }

Tiếp theo tất cả chúng ta cần cấu hình thiết lập puppeteer:

npm install -save puppeteer

sau lúc lệnh này chạy xong tất cả chúng ta thêm dòng code “start”: “node index.js” vào trong package.json

nano package.json { . . . “scripts”: { “test”: “echo “Error: no test specified” && exit 1″, “start”: “node index.js” ## thêm vào đây }, . . . “dependencies”: { “puppeteer”: “^5.2.1” } }

từ h trở đi bạn phải chạy lệnh npm run start là có thể start app của bạn lên, nó tương đương với bạn chạy lệnh node index.js

Setup Browser

Như tất cả chúng ta biết puppeteer đây chính là một headless browser like Chromium, được chấp nhận tất cả chúng ta chạy browser mà ko cần user interface., trong bước này tất cả chúng ta sẽ tạo ra file browser.js để khởi chạy một headless browser

nano browser.js // ./book-scraper/browser.js const puppeteer = require(‘puppeteer’); async function startBrowser(){ let browser; try { console.log(“Opening the browser……”); browser = await puppeteer.launch({ headless: false, args: [“-disable-setuid-sandbox”], ‘ignoreHTTPSErrors’: true }); } catch (err) { console.log(“Could not create a browser instance => : “, err); } return browser; } module.exports = { startBrowser };

File này khá đơn giản, nhiệm vụ của nó chỉ là khởi tạo một browser lên để cho tất cả chúng ta dùng sau này mà thôi, bạn phải lưu ý một chỗ là headless: false, có nghĩ là bạn đang khởi tạo một browser có giao diện người dùng, bật có giao diện lên trong quá trình dev để tất cả chúng ta biết được nó chạy thế nào thôi, còn khi deploy lên server bạn phải ẩn nó đi, nếu không ẩn khi chạy nó sẽ báo lỗi. có nhẽ vì server thường ko cài giao diện

Tiếp theo tất cả chúng ta cần file index.js là file chạy chính và file pageController.js để điều phối bot của bạn

// ./book-scraper/index.js const browserObject = require(‘./browser’); const scraperController = require(‘./pageController’); //Start the browser and create a browser instance let browserInstance = browserObject.startBrowser(); // Pass the browser instance to the scraper controller scraperController(browserInstance) // ./book-scraper/pageController.js const pageScraper = require(‘./pageScraper’); async function scrapeAll(browserInstance){ let browser; try{ browser = await browserInstance; await pageScraper.scraper(browser); } catch(err){ console.log(“Could not resolve the browser instance => “, err); } } module.exports = (browserInstance) => scrapeAll(browserInstance)

Tiếp theo tất cả chúng ta tạo 1 file pageScraper.js, file này sẽ sở hữu được nhiệm vụ đây chính là đọc tài liệu của website

const scraperObject = { url: ‘http://books.toscrape.com’, async scraper(browser){ let page = await browser.newPage(); console.log(`Navigating to ${this.url}…`); await page.goto(this.url); } } module.exports = scraperObject;

cuối cùng project của tất cả chúng ta sẽ sở hữu được cấu trúc flle như sau:

. ├── browser.js ├── index.js ├── node_modules ├── package-lock.json ├── package.json ├── pageController.js └── pageScraper.js

Đến đây khi chúng ta chạy npm run start thì nó sẽ tự mở một browser lên, bật 1 tab mới và tự động hóa vào website books.toscrape.com

đến đây là project của bạn đã setup trong toàn bộ rồi, chỉ việc code thôi. nội dung bài viết này cũng rất dài rồi, mình sẽ tách phần bóc tách tài liệu và deploy server sang một bài tiếp nhé.

Tham khảo

  • https://viblo.asia/p/nghich-ngom-voi-puppeteer-Qbq5Q3j4ZD8
  • https://www.digitalocean.com/community/tutorials/how-to-scrape-a-website-using-node-js-and-puppeteer

You May Also Like

About the Author: v1000