Node爬虫(二):使用cheerio爬取表情包
cheerio
官方在線文檔
簡(jiǎn)介
cheerio是nodejs的抓取頁(yè)面模塊,為服務(wù)器特別定制的,快速、靈活、實(shí)施的jQuery核心實(shí)現(xiàn)。適合各種Web爬蟲(chóng)程序
安裝
npm install cheerio使用
1、載入html字符串
const cheerio = require('cheerio'); const $ = cheerio.load('<ul id="fruits">...</ul>');2、選擇器
Cheerio的選擇器實(shí)現(xiàn)與jQuery的選擇器實(shí)現(xiàn)幾乎相同,因此API非常相似
例如:獲取id為app下的所有a標(biāo)簽
$(#app a)爬取表情包
表情包網(wǎng)址:斗圖了
這里爬取第二頁(yè),因?yàn)橛幸?guī)律
https://www.doutula.com/article/list/?page=2注: 這里遇到了些問(wèn)題,主要是分析網(wǎng)頁(yè)源代碼時(shí)分析錯(cuò)誤了,這里建議將要分析的代碼下載到本地,格式化一下再分析
代碼
//加載模塊 var cheerio = require('cheerio') var axios = require('axios') var fs = require('fs') var path = require('path') var http = require('http')//表情包網(wǎng)址 bqb_url = "https://www.doutula.com/article/list/?page=2"//發(fā)起ajax請(qǐng)求 axios.get(bqb_url).then((res) => {//導(dǎo)入要分析的htmlconst $ = cheerio.load(res.data);//獲取表情包所在的所有img標(biāo)簽var all_img = $('.container_ .container .row .col-sm-9 a .random_article .col-xs-6 img')//爬取對(duì)應(yīng)的網(wǎng)頁(yè)源代碼,便于接下來(lái)的分析/* fs.writeFile('./a.html',all_img,function(err){if(err){console.log("失敗")}}) *///根據(jù)屬性獲取所有的圖片地址,并將其保存在本地$(all_img).each(function() {//console.log($(this).attr('data-backup')) 打印所有的圖片地址var img_url = $(this).attr('data-backup')if (typeof img_url === 'string') {imgObj = path.parse(img_url) //解析圖片地址img_name = imgObj.base //圖片名稱//保存圖片到本地var stream = fs.createWriteStream('./file/' + img_name)axios.get(img_url, {responseType: 'stream'}).then(function(res) {res.data.pipe(stream)res.data.on('close', function() {console.log(img_name + "圖片保存完成")stream.close() //關(guān)閉文件寫(xiě)入流})})}}); })效果圖:
遇到的坑
1、有些圖片的url地址不存在,先判斷是否存在,否則保存時(shí)會(huì)保存
3、file文件夾必須存在,否則也會(huì)保存
4、保存文件
我也是node剛開(kāi)始學(xué),有些東西也不明白。第一次是想通過(guò)fs的readFile讀取圖片,然后再通過(guò)writeFile將文件保存,但是不行無(wú)法讀取網(wǎng)上的文件,所以還是要通過(guò)創(chuàng)建流,再使用管道的方式保存
var stream = fs.createWriteStream('./file/' + img_name)axios.get(img_url, { //必須指定響應(yīng)類型,不然無(wú)法正確下載圖片responseType: 'stream' }).then(function(res) {res.data.pipe(stream)}) }5、網(wǎng)絡(luò)請(qǐng)求
這里使用的axios進(jìn)行網(wǎng)絡(luò)請(qǐng)求,好處是前后端都可以使用,比較統(tǒng)一。當(dāng)然也可以使用node本身的http請(qǐng)求(或https請(qǐng)求),但是網(wǎng)址如果是http請(qǐng)求就需要使用http請(qǐng)求,是https請(qǐng)求就需要使用https請(qǐng)求
總結(jié)
以上是生活随笔為你收集整理的Node爬虫(二):使用cheerio爬取表情包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python | Python保存高维数
- 下一篇: 微信小程序万里目_微信小程序加盟千万别忘