1.安裝:
npm install cheerio
npm install axios
2.介紹:
2.1 cheerio 特點和用途描述:
- HTML解析和操作:Cheerio 可以將 HTML 字符串加載到內存中,并將其轉換為一個可操作的 DOM 樹結構,從而可以方便地對 HTML 文檔進行解析和操作。
- 類似于 jQuery 的API:Cheerio 提供了類似于 jQuery 的選擇器和操作方法,使用戶可以使用 CSS 選擇器、DOM 操作等方法來操縱 HTML 文檔,例如查找元素、修改屬性、添加樣式等。
- 輕量級:相比于瀏覽器端的 jQuery,Cheerio 是一個輕量級的庫,適用于服務器端的 Node.js 環境,可以高效地進行 HTML 解析和操作,而無需運行整個瀏覽器引擎。
- 方便的數據提取:通過 Cheerio,用戶可以方便地從 HTML 文檔中提取所需的數據,例如爬取網頁內容、解析HTML 結構等,常用于網絡爬蟲、數據抓取等任務。
- 模塊化:Cheerio 可以與其他 Node.js 模塊和工具結合使用,例如請求庫(如 Axios、request)、文件系統操作等,從而實現更復雜的任務和功能。
2.2 使用axios進行網絡請求
2.3 fs進行文件操作:將請求的數據,寫入到指定的文件夾中
涉及到的知識點:
-
response.data.pipe(); 返回的是文件流的操作
-
fs.createWriteStream() 寫入文件流的操作
3.示例:
const cheerio = require('cheerio');const axios = require('axios');const fs = require('fs');const path = require('path');const headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36'};const downloadImage = async (url, filePath) => {const response = await axios({url: url,method: 'GET',responseType: 'stream'});response.data.pipe(fs.createWriteStream(filePath));return new Promise((resolve, reject) => {response.data.on('end', () => {resolve();});response.data.on('error', (err) => {reject(err);});});};const crawler = async (options) => {for (let i = 1; i <= options.page; i++) {const url = i === 1 ? options.url : `${options.url}list_${i}.html`;console.log(url);try {const response = await axios.get(url, {headers: headers});const $ = cheerio.load(response.data);const imageElements = $('.pics img');imageElements.each((index, element) => {const imageUrl = $(element).attr('src');if (imageUrl) {const imageName = `${i}-${index}.jpg`;const imagePath = path.join(__dirname, 'img', imageName);downloadImage(imageUrl, imagePath).then(() => {console.log(`${i} ---- ${index}`, imageUrl, 'Downloaded successfully.');}).catch((error) => {console.error(`${i} ---- ${index}`, imageUrl, 'Download failed. Error:', error);});}});} catch (err) {console.error('Error fetching or parsing the page:', err);}}};crawler({url: 'http://www.duoziwang.com/head/gexing/',page: 10});