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