nodejs爬蟲(chóng)初試superagent和cheerio
前言
早就聽(tīng)過(guò)爬蟲(chóng),這幾天開(kāi)始學(xué)習(xí)nodejs,寫(xiě)了個(gè)爬蟲(chóng)https://github.com/leichangchun/node-crawlers/tree/master/superagent_cheerio_demo,爬取 博客園首頁(yè)的文章標(biāo)題、用戶名、閱讀數(shù)、推薦數(shù)和用戶頭像,現(xiàn)做個(gè)小總結(jié)。
使用到這幾個(gè)點(diǎn):
1、node的核心模塊-- 文件系統(tǒng)
2、用于http請(qǐng)求的第三方模塊 -- superagent
3、用于解析DOM的第三方模塊 -- cheerio
幾個(gè)模塊詳細(xì)的講解及API請(qǐng)到各個(gè)鏈接查閱,demo中只有簡(jiǎn)單的用法。
準(zhǔn)備工作
使用npm管理依賴,依賴信息會(huì)存放在package.json中
//安裝用到的第三方模塊 cnpm install --save superagent cheerio
引入所需要用到的功能模塊
//引入第三方模塊,superagent用于http請(qǐng)求,cheerio用于解析DOM
const request = require('superagent');
const cheerio = require('cheerio');
const fs = require('fs');
請(qǐng)求 + 解析頁(yè)面
想要爬到博客園首頁(yè)的內(nèi)容,首先要請(qǐng)求首頁(yè)地址,拿到返回的html,這里使用superagent進(jìn)行http請(qǐng)求,基本的使用方法如下:
request.get(url)
.end(error,res){
//do something
}
向指定的url發(fā)起get請(qǐng)求,請(qǐng)求錯(cuò)誤時(shí),會(huì)有error返回(沒(méi)有錯(cuò)誤時(shí),error為null或undefined),res為返回的數(shù)據(jù)。
拿到html內(nèi)容后,要拿到我們想要的數(shù)據(jù),這個(gè)時(shí)候就需要用cheerio解析DOM了,cheerio要先load目標(biāo)html,然后再進(jìn)行解析,API和jquery的API非常類似,熟悉jquery上手非???。直接看代碼實(shí)例
//目標(biāo)鏈接 博客園首頁(yè)
let targetUrl = 'https://www.cnblogs.com/';
//用來(lái)暫時(shí)保存解析到的內(nèi)容和圖片地址數(shù)據(jù)
let content = '';
let imgs = [];
//發(fā)起請(qǐng)求
request.get(targetUrl)
.end( (error,res) => {
if(error){ //請(qǐng)求出錯(cuò),打印錯(cuò)誤,返回
console.log(error)
return;
}
// cheerio需要先load html
let $ = cheerio.load(res.text);
//抓取需要的數(shù)據(jù),each為cheerio提供的方法用來(lái)遍歷
$('#post_list .post_item').each( (index,element) => {
//分析所需要的數(shù)據(jù)的DOM結(jié)構(gòu)
//通過(guò)選擇器定位到目標(biāo)元素,再獲取到數(shù)據(jù)
let temp = {
'標(biāo)題' : $(element).find('h3 a').text(),
'作者' : $(element).find('.post_item_foot > a').text(),
'閱讀數(shù)' : +$(element).find('.article_view a').text().slice(3,-2),
'推薦數(shù)' : +$(element).find('.diggnum').text()
}
//拼接數(shù)據(jù)
content += JSON.stringify(temp) + '\n';
//同樣的方式獲取圖片地址
if($(element).find('img.pfs').length > 0){
imgs.push($(element).find('img.pfs').attr('src'));
}
});
//存放數(shù)據(jù)
mkdir('./content',saveContent);
mkdir('./imgs',downloadImg);
})
存儲(chǔ)數(shù)據(jù)
上面解析DOM之后,已經(jīng)拼接了所需要的信息內(nèi)容,也拿到了圖片的URL,現(xiàn)在就進(jìn)行存儲(chǔ),把內(nèi)容存放到指定目錄的txt文件中,而且下載圖片到指定目錄
先創(chuàng)建目錄,使用nodejs核心的文件系統(tǒng)
//創(chuàng)建目錄
function mkdir(_path,callback){
if(fs.existsSync(_path)){
console.log(`${_path}目錄已存在`)
}else{
fs.mkdir(_path,(error)=>{
if(error){
return console.log(`創(chuàng)建${_path}目錄失敗`);
}
console.log(`創(chuàng)建${_path}目錄成功`)
})
}
callback(); //沒(méi)有生成指定目錄不會(huì)執(zhí)行
}
有了指定目錄之后,可以寫(xiě)入數(shù)據(jù)了,txt文件的內(nèi)容已經(jīng)有了,直接寫(xiě)入就可以了使用writeFile()
//將文字內(nèi)容存入txt文件中
function saveContent() {
fs.writeFile('./content/content.txt',content.toString());
}
取到了圖片的鏈接,所以需要再使用superagent下載圖片,存在本地。superagent可以直接返回一個(gè)響應(yīng)流,再配合nodejs的管道,直接把圖片內(nèi)容寫(xiě)到本地
//下載爬到的圖片
function downloadImg() {
imgs.forEach((imgUrl,index) => {
//獲取圖片名
let imgName = imgUrl.split('/').pop();
//下載圖片存放到指定目錄
let stream = fs.createWriteStream(`./imgs/${imgName}`);
let req = request.get('https:' + imgUrl); //響應(yīng)流
req.pipe(stream);
console.log(`開(kāi)始下載圖片 https:${imgUrl} --> ./imgs/${imgName}`);
} )
}
效果
執(zhí)行下demo,看下效果,數(shù)據(jù)已經(jīng)正常爬下來(lái)了

非常簡(jiǎn)單的一個(gè)demo,可能也沒(méi)有那么嚴(yán)謹(jǐn),不過(guò)總是走出了node的第一小步。
總結(jié)
以上所述是小編給大家介紹的nodejs爬蟲(chóng)初試superagent和cheerio,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- NodeJS制作爬蟲(chóng)全過(guò)程
- nodejs爬蟲(chóng)抓取數(shù)據(jù)亂碼問(wèn)題總結(jié)
- NodeJS制作爬蟲(chóng)全過(guò)程(續(xù))
- nodeJs爬蟲(chóng)獲取數(shù)據(jù)簡(jiǎn)單實(shí)現(xiàn)代碼
- Nodejs爬蟲(chóng)進(jìn)階教程之異步并發(fā)控制
- nodeJS實(shí)現(xiàn)簡(jiǎn)單網(wǎng)頁(yè)爬蟲(chóng)功能的實(shí)例(分享)
- nodejs爬蟲(chóng)抓取數(shù)據(jù)之編碼問(wèn)題
- 基于nodejs 的多頁(yè)面爬蟲(chóng)實(shí)例代碼
- nodejs爬蟲(chóng)遇到的亂碼問(wèn)題匯總
- nodejs制作小爬蟲(chóng)功能示例
相關(guān)文章
node.js中的fs.rmdirSync方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.rmdirSync方法使用說(shuō)明,本文介紹了fs.rmdirSync方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
詳解一個(gè)基于套接字實(shí)現(xiàn)長(zhǎng)連接的express
這篇文章主要介紹了詳解一個(gè)基于套接字實(shí)現(xiàn)長(zhǎng)連接的express,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
基于Koa(nodejs框架)對(duì)json文件進(jìn)行增刪改查的示例代碼
這篇文章主要介紹了基于Koa(nodejs框架)對(duì)json文件進(jìn)行增刪改查的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
在?node?中使用?koa-multer?庫(kù)上傳文件的方式詳解
本文主要介紹了上傳單個(gè)文件、多個(gè)文件,文件數(shù)量大小限制、限制文件上傳類型和對(duì)上傳的圖片進(jìn)行不同大小的裁剪,對(duì)node使用?koa-multer?庫(kù)上傳文件相關(guān)知識(shí)感興趣的朋友一起看看吧2024-01-01
npm 更改默認(rèn)全局路徑以及國(guó)內(nèi)鏡像的方法
今天小編就為大家分享一篇npm 更改默認(rèn)全局路徑以及國(guó)內(nèi)鏡像的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
node連接kafka2.0實(shí)現(xiàn)方法示例
這篇文章主要介紹了node連接kafka2.0,nodejs連接kafka2.0的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了kafka2.0的功能、原理、以及node.js連接kafka2.0的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2023-05-05

