nodejs中使用cheerio爬取並解析html網頁
cheerio用於node環境,用法與語法都類似於jquery。jquery本身也可以用於node,在借助於第三方庫jsdom的情況下,詳見:https://www.npmjs.com/package/jquery
安裝
npm install cheerio
使用
const cheerio = require('cheerio') const $ = cheerio.load('<h2 class="title">Hello world</h2>') $('h2.title').text('Hello there!') $('h2').addClass('welcome') $.html() //=> <html><head></head><body><h2 class="title welcome">Hello there!</h2></body></html>
運用
場景
取出這個網址中的文章列表:https://support.fcoin.com/hc/zh-cn/sections/360000782633-最新公告
分析html源碼
重點關注class="article-list-link"的<a>,提取它里attr屬性與text內容,就算完成目標了。
<ul class="article-list"> <li class="article-list-item "> <a href="/hc/zh-cn/articles/360006803454-FT%E9%A2%84%E5%85%88%E5%8F%91%E8%A1%8C%E9%83%A8%E5%88%86%E5%AE%9E%E8%A1%8C-%E8%A7%A3%E5%86%BB%E5%8D%B3%E9%94%81%E4%BB%93-%E5%8E%9F%E5%88%99%E7%9A%84%E5%85%AC%E5%91%8A" class="article-list-link">FT預先發行部分實行“解凍即鎖倉”原則的公告</a> </li> <li class="article-list-item "> <a href="/hc/zh-cn/articles/360006823933-%E5%85%B3%E4%BA%8EFInsur%E8%BF%90%E4%BD%9C%E6%9C%BA%E5%88%B6%E7%9A%84%E4%B8%80%E7%B3%BB%E5%88%97%E8%AF%B4%E6%98%8E" class="article-list-link">關於FInsur運作機制的一系列說明</a> </li> ...
代碼與注釋說明
var request = require('request') const cheerio = require('cheerio') var http = (uri) => { return new Promise((resolve, reject) => { request({ uri: uri, method: 'GET' }, (err, response, body) => { if (err) { console.log(err) } resolve(body) }) }) } (function () { // 定義目標網址 var target = 'https://support.fcoin.com/hc/zh-cn/sections/360000782633-%E6%9C%80%E6%96%B0%E5%85%AC%E5%91%8A' // 使用request.js庫發送get請求 http(target).then(html => { // 載入並初始化cheerio const $ = cheerio.load(html) // 取出目標節點,即帶article-list-link css類的<a> var linksDom = $('a.article-list-link') // 遍歷dom集數組 linksDom.each((index, item) => { // 取出title,注意這里使用了$(item),而不是item本身 var title = $(item).text() // 類似地,取出鏈接地址 var url = $(item).attr('href') // 解碼可選,為了讓結果顯示中文漢字更直觀 url = decodeURIComponent(url) // 由於href使用的是相對於根目標的路徑,因而從目標網址中提取域名前綴拼接上 url = target.match(/(\w+:\/\/[^/:]+)([^# ]*)/)[1] + url // 輸出到控制台預覽結果 console.log(title) console.log(url) }) }) })()
預覽結果
result.png
對比說明
相比純正則表達式解析,使用cheerio輕松,語義也清晰,特別適合html文本這種特定環境下使用。
