要獲取數(shù)據(jù),你必須求助于網(wǎng)絡(luò)抓取。本篇文章就來介紹一下如何使用Node和Cheerio抓取網(wǎng)站數(shù)據(jù),希望對大家有所幫助!
在我們開始之前,你需要遵守當?shù)氐姆o法規(guī),不可隨意抓取未經(jīng)允許公開的數(shù)據(jù)。
先決條件
以下是本教程需要的一些東西:
- 你需要安裝Node.js。如果你沒有 Node,只需確保從Node.js 下載頁面為你的系統(tǒng)下載它(https://nodejs.dev/download/)
- 你需要在你的機器上安裝一個文本編輯器,比如VSCode或Atom
- 你至少應(yīng)該對 JavaScript、Node.js 和文檔對象模型 (DOM) 有基本的了解。
什么是 Cheerio?
Cheerio 是一個在 Node.js 中解析 HTML 和 XML 的工具,在 GitHub 上非常受歡迎,擁有超過23k 的 star 。
它快速、靈活且易于使用。由于它實現(xiàn)了 JQuery 的一個子集,如果你已經(jīng)熟悉 JQuery,那么很容易開始使用 Cheerio。
Cheerio 和 Web 瀏覽器之間的主要區(qū)別在于,cheerio 不生成視覺渲染、加載 CSS、加載外部資源或執(zhí)行 JavaScript。它只是解析標記并提供用于操作生成的數(shù)據(jù)結(jié)構(gòu)的 API。這就解釋了為什么它也非??臁猚heerio 文檔。
如果你想使用cheerio 來抓取網(wǎng)頁,您需要首先使用axios或node-fetch等包來獲取標記。
如何使用 Cheerio 在 Node 中抓取網(wǎng)頁
在此示例中,我們將抓取此 Wikipedia 頁面上列出的所有國家和其他司法管轄區(qū)的ISO 3166-1 alpha-3 代碼。它位于ISO 3166-1 alpha-3頁面的當前代碼部分下。
這是國家/司法管轄區(qū)列表及其相應(yīng)代碼的樣子:
第 1 步 – 創(chuàng)建工作目錄
在此步驟中,您將通過在終端上運行以下命令為您的項目創(chuàng)建一個目錄。該命令將創(chuàng)建一個名為learn-cheerio
. 如果你愿意,你可以給它一個不同的名字。
mkdir learn-cheerio
learn-cheerio
成功運行上述命令后,您應(yīng)該能夠看到一個名為 created 的文件夾。
在下一步中,您將在您喜歡的文本編輯器中打開剛剛創(chuàng)建的目錄并初始化項目。
第 2 步 – 初始化項目
在此步驟中,您將導(dǎo)航到項目目錄并初始化項目。在您喜歡的文本編輯器中打開您在上一步中創(chuàng)建的目錄,并通過運行以下命令來初始化項目。
npm init -y
成功運行上述命令將package.json
在項目目錄的根目錄下創(chuàng)建一個文件。
在下一步中,您將安裝項目依賴項。
第 3 步 – 安裝依賴項
在此步驟中,您將通過運行以下命令來安裝項目依賴項。這將需要幾分鐘,所以請耐心等待。
npm i axios cheerio pretty
成功運行上述命令將在字段package.json
下的文件中注冊三個依賴項。dependencies
第一個依賴是axios
,第二個是cheerio
,第三個是pretty
。
axios是一個非常流行的http 客戶端,可以在 node 和瀏覽器中運行。我們需要它,因為cheerio 是一個標記解析器。
為了讓 Cheerio 解析標記并抓取您需要的數(shù)據(jù),我們需要axios
用于從網(wǎng)站獲取標記。如果您愿意,可以使用另一個 HTTP 客戶端來獲取標記。它不一定是axios
.
pretty是用于美化標記的 npm 包,以便在終端上打印時可讀。
在下一部分中,您將檢查將從中抓取數(shù)據(jù)的標記。
第 4 步 – 檢查您要抓取的網(wǎng)頁
在從網(wǎng)頁中抓取數(shù)據(jù)之前,了解頁面的 HTML 結(jié)構(gòu)非常重要。
在此步驟中,您將檢查要從中抓取數(shù)據(jù)的網(wǎng)頁的 HTML 結(jié)構(gòu)。
導(dǎo)航到Wikipedia 上的ISO 3166-1 alpha-3 代碼頁面。在“當前代碼”部分下,有一個國家列表及其相應(yīng)的代碼。CTRL + SHIFT + I
您可以通過按chrome 上的組合鍵或右鍵單擊然后選擇“檢查”選項來打開 DevTools 。
這是我在 chrome DevTools 中的列表:
在下一節(jié)中,您將編寫用于抓取網(wǎng)頁的代碼。
第 5 步 – 編寫代碼以抓取數(shù)據(jù)
在本節(jié)中,你將編寫用于抓取我們感興趣的數(shù)據(jù)的代碼。首先運行以下將創(chuàng)建app.js
文件的命令。
touch app.js
成功運行上述命令將app.js
在項目目錄的根目錄下創(chuàng)建一個文件。
像任何其他 Node 包一樣,在開始使用它們之前,你必須首先require axios
、cheerio
和。你可以通過在剛剛創(chuàng)建pretty
的文件頂部添加下面的代碼來做到這一點。app.js
const axios = require("axios"); const cheerio = require("cheerio"); const pretty = require("pretty");
在我們編寫用于抓取數(shù)據(jù)的代碼之前,我們需要學習cheerio
. 我們將解析下面的標記并嘗試操作生成的數(shù)據(jù)結(jié)構(gòu)。這將幫助我們學習 Cheerio 語法及其最常用的方法。
下面的標記是ul
包含我們元素的li
元素。
const markup = ` <ul class="fruits"> <li class="fruits__mango"> Mango </li> <li class="fruits__apple"> Apple </li> </ul> `;
將上述變量聲明添加到app.js
文件中
如何在 Cheerio 中加載標記
cheerio
你可以使用該cheerio.load
方法加載標記。該方法將標記作為參數(shù)。它還需要另外兩個可選參數(shù)。如果你有興趣,可以在文檔中閱讀有關(guān)它們的