JavaScript 爬蟲是一種能夠在網站上自動搜索和抓取數據的工具。一方面,JavaScript 爬蟲有助于網絡內容的規范和監管;另一方面,它也是數據挖掘、市場調研等方面的重要工具。如今,市面上已經有很多 JavaScript 爬蟲庫,其中比較流行的有以下幾個:
1. Cheerio
2. Puppeteer
3. Request
4. Axios
5. JSDOM
接下來,我們逐一來介紹一下這些庫的基本特點和優點。
Cheerio
Cheerio 是一款輕量級、快速、靈活的 DOM 解析庫。在使用 Cheerio 的時候,我們可以像 jQuery 一樣來操作 DOM。它的第一大優勢就是速度比較快,因為它沒有處理頁面渲染、JavaScript 執行等等這些和 DOM 解析無關的內容。舉例來說,假設我們想從網站上爬取成語大全的數據,我們可以使用以下代碼:
const cheerio = require('cheerio');
const axios = require('axios');
const url = 'http://chengyu.t086.com/';
axios.get(url).then(res => {
const $ = cheerio.load(res.data);
const dataArr = [];
$('#main tr').each((i, item) => {
dataArr.push({
name: $(item).find('td').eq(0).text(),
pinyin: $(item).find('td').eq(1).text(),
explanation: $(item).find('td').eq(2).text(),
});
});
console.log(dataArr);
});
Puppeteer
Puppeteer 是一個 Node 庫,它提供了一種高級的 API 可以在 Chrome 或 Chromium 上操作網頁。和 Cheerio 不同,Puppeteer 可以處理 JavaScript 渲染的問題。它的第一大優點就是操作性強。我們可以通過 Puppeteer 來進行自動化操作,例如填寫表單、點擊按鈕、選擇選項等等。下面我們來舉個例子。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://www.baidu.com');
await page.type('#kw', 'JavaScript 爬蟲');
await page.click('#su');
// 等待獲取數據
await page.waitForSelector('#content_left');
const result = await page.evaluate(() => {
const itemList = document.querySelectorAll('#content_left .result');
const dataArr = [];
itemList.forEach(item => {
dataArr.push({
title: item.querySelector('.t').textContent,
url: item.querySelector('.c-showurl').textContent,
content: item.querySelector('.c-abstract').innerHTML,
});
});
return dataArr;
});
console.log(result);
await browser.close();
})();
Request
Request 是一款 Node.js 的第三方庫,它提供了一系列請求方法,可以用于 HTTP 請求。 和前面介紹的兩個庫不同,Request 適用于爬取純 HTML 頁面,無法爬取攜帶 JavaScript 的頁面。
const request = require('request');
const cheerio = require('cheerio');
const url = 'http://www.baidu.com';
request(url, (err, response, body) => {
if (!err && response.statusCode == 200) {
const $ = cheerio.load(body);
console.log($('title').text());
}
});
Axios
Axios 這款庫也是 Node.js 的一個第三方庫,它和 Request 類似,不同的是它不僅能夠進行 HTTP 請求,還可以處理 JSON 格式的數據。Axios 支持 Promise 和 async/await 兩種方式進行調用,增強了代碼可讀性和可維護性。
const axios = require('axios');
const url = 'https://api.github.com/users/github';
axios.get(url).then(res => {
console.log(res.data);
});
JSDOM
JSDOM 是一種能夠實現 DOM 的 JavaScript 庫。它是在 Node.js 中模擬實現了瀏覽器 DOM API 的庫。這意味著,JSDOM 可以解析 HTML 形成 DOM,并且可以讓我們像在瀏覽器中一樣操作 DOM。舉例來說,我們可以使用 JSDOM 來爬取新浪微博某個用戶的所有微博數據。
const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const axios = require('axios');
const url = 'https://weibo.com/u/1735881995';
axios.get(url).then(res => {
const { document } = new JSDOM(res.data).window;
const itemList = document.querySelectorAll('.WB_feed_detail');
const dataArr = [];
itemList.forEach(item => {
dataArr.push({
time: item.querySelector('.WB_from').textContent,
text: item.querySelector('.WB_text').textContent,
});
});
console.log(dataArr);
});
綜上所述,以上五款 JavaScript 爬蟲庫各有特色,具體使用取決于爬取的內容和目標網站的特點。在使用前,我們還應該注意網站的反爬蟲機制,盡量模擬人類行為,以免給服務器造成過大的負擔。