Web Scraping bằng Node.js và Puppeteer

Hướng dẫn giới thiệu ngắn về Web Scraping

Web Scraping là nhiệm vụ tải xuống một trang web và trích xuất một số loại thông tin từ nó.

Gần đây tôi đã thực hiện một dự án nhỏ với bảng Arduino có gắn màn hình LCD. Sử dụng Johnny-Five, cho phép chúng tôi lập trình Arduino bằng Node.js, tôi muốn lấy nhiệt độ đo được ở đỉnh núi và hiển thị nó trên bảng Arduino.

Tôi đã sử dụngNgười múa rốiđể làm nhiệm vụ cạo. Puppeteer là một công cụ tuyệt vời do Google xây dựng. Đó là một thư viện Node mà chúng ta có thể sử dụng để điều khiển phiên bản Chrome không đầu.

Điều này có nghĩa là về cơ bản chúng tôi đang sử dụng Chrome nhưng theo chương trình.

Có nhiều cách sử dụng thực tế cho Puppeteer, bao gồm tự động hóa thử nghiệm, tạo ảnh chụp màn hình, tạo phiên bản hiển thị phía máy chủ của các ứng dụng trang đơn và hơn thế nữa.

Bắt đầu bằng cách cài đặt nó bằng

npm install puppeteer

Trong tệp Node.js, hãy yêu cầu nó:

const puppeteer = require('puppeteer');

sau đó chúng ta có thể sử dụnglaunch()phương pháp để tạo một phiên bản trình duyệt:

(async () => {
  const browser = await puppeteer.launch()
})()

Chúng tôi sử dụngawaitvà vì vậy chúng ta phải gói lời gọi phương thức này trong mộtchức năng không đồng bộ, mà chúng tôingay lập tức gọi.

Tiếp theo, chúng ta có thể sử dụngnewPage()phương pháp trênbrowserđối tượng để có đượcpagevật:

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
})()

Tiếp theo, chúng tôi gọigoto()phương pháp trênpageđối tượng để tải trang đó:

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://website.com')
})()

Cuối cùng, chúng ta có thể nhận được trangNội dunggọi choevaluate()phương pháp củapage. Phương thức này sử dụng một hàm gọi lại nơi chúng ta có thể thêm mã cần thiết để truy xuất các phần tử của trang mà chúng ta cần. Hàm được thực thi trong ngữ cảnh của một trang, vì vậy chúng tôi có quyền truy cập vàodocumentvà tất cả các API của trình duyệt. Chúng tôi trả về một đối tượng mới và đây sẽ là kết quả củaevaluate()cuộc gọi phương thức.

Chúng ta có thể sử dụngAPI bộ chọnvà lấy dữ liệu từ trang.

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://website.com')
<span style="color:#66d9ef">const</span> <span style="color:#a6e22e">result</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">await</span> <span style="color:#a6e22e">page</span>.<span style="color:#a6e22e">evaluate</span>(() =&gt; {
<span style="color:#75715e">//...

}) })()

Hãy đi đến vấn đề cụ thể mà tôi có. Đây là trang đặt trạm sao băng, nằm trên đỉnh núi ở độ cao 3315m:http://www.meteocentrale.ch/it/europa/svizzera/meteo-corvatsch/details/S067910/

Tôi muốn lấy nó-9°Cbản văn. Sử dụng trình kiểm tra trình duyệt, tôi có thể thấy nó cócolumn-4lớp đính kèm. Đó không phải là một tên lớp lý tưởng, vì nó không có ý nghĩa và có thể thay đổi nếu họ quyết định thêm một cột mới, nhưng đây là những gì chúng tôi nhận được:

Đây là mã hoàn chỉnh cho đến nay:

const puppeteer = require('puppeteer');

(async () => { const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto(http://www.meteocentrale.ch/it/europa/svizzera/meteo-corvatsch/details/S067910/)

<span style="color:#66d9ef">const</span> <span style="color:#a6e22e">result</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">await</span> <span style="color:#a6e22e">page</span>.<span style="color:#a6e22e">evaluate</span>(() =&gt; {
  <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">temperature</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">'.column-4'</span>).<span style="color:#a6e22e">innerText</span>
<span style="color:#66d9ef">return</span> {
    <span style="color:#a6e22e">temperature</span>
  }

})

console.log(result)

browser.close() })()

Nếu chúng tôi chạy mã này,resultsẽ có giá trị này:

{
  temperature: '-9°C'
}

hoặc bất kể nhiệt độ hiện tại là bao nhiêu.