身为一名热衷于新科技的小白,最近我试着用Node.js做了个网页抓取工具。期间学到一个神奇的插件——cheerio!今天就聊聊我如何借助cheerio大展拳脚,从博客园主页捞了一堆有用信息的经历。
初识cheerio:我的第一印象
//安装用到的第三方模块 cnpm install --save superagent cheerio
开始用cheerio时我啥都不懂,但看到它跟jQuery差不多,简直太神奇了!因为之前学过点jquery,所以立马就懂得怎么玩儿了。cheerio帮我从HTML里挖出想要的东西,对我做网页爬虫项目真是大有用处!
使用npm管理依赖:一个简单的开始
//引入第三方模块,superagent用于http请求,cheerio用于解析DOM const request = require('superagent'); const cheerio = require('cheerio'); const fs = require('fs');
要用Cheerio前得确定装对没。用npm一行命令帮你把Cheerio加进项目依赖里去,再把依赖信息写入package.json文件。很简单?集中管理依赖让项目维护更省心。
请求与解析:我的爬虫之旅
request.get(url) .end(error,res){ //do something }
我要搞定博客园首页的抓取!首先用超能使者(SuperAgent)发个HTTP请求,就能拿到网页的HTML标签。这个超能使者太好用了,不多会儿我就懂得怎么用了。接着,就是利用Cheerio来解构它,把我想要的东西抠出来。这个步骤真的很好玩,看着我的代码一点点把网页变成我能用的结构,真是太有成就感了!
代码实践:我的第一个爬虫脚本
动手编爬虫脚本的时候,我参考了别人的例子,再加了点我自己需要的东西。先用cheerio的load方法翻页看HTML,像用jQuery样式一样选我关心的部分。这样,我就轻松搞定了博客文章的标题啊、内容啊和图片地址。这可真是成就感满满,因为我亲自打造出了个功能全的爬虫!
//目标链接 博客园首页 let targetUrl = 'https://www.cnblogs.com/'; //用来暂时保存解析到的内容和图片地址数据 let content = ''; let imgs = []; //发起请求 request.get(targetUrl) .end( (error,res) => { if(error){ //请求出错,打印错误,返回 console.log(error) return; } // cheerio需要先load html let $ = cheerio.load(res.text); //抓取需要的数据,each为cheerio提供的方法用来遍历 $('#post_list .post_item').each( (index,element) => { //分析所需要的数据的DOM结构 //通过选择器定位到目标元素,再获取到数据 let temp = { '标题' : $(element).find('h3 a').text(), '作者' : $(element).find('.post_item_foot > a').text(), '阅读数' : +$(element).find('.article_view a').text().slice(3,-2), '推荐数' : +$(element).find('.diggnum').text() } //拼接数据 content += JSON.stringify(temp) + 'n'; //同样的方式获取图片地址 if($(element).find('img.pfs').length > 0){ imgs.push($(element).find('img.pfs').attr('src')); } }); //存放数据 mkdir('./content',saveContent); mkdir('./imgs',downloadImg); })
数据存储:我的爬虫项目的最后一步
搞定数据以后,接下来就得把它们存起来!我用了Node.js的文件系统模块搞定了目录,再用txt文件把复制出来的文本塞进去。对于那些图片,我还是借助了利器superagent帮我下载到设定好的地方。这过程有点绕,不过好在最后我还是妥妥地把所有数据都搬进了硬盘。
测试与反思:我的爬虫项目总结
//创建目录 function mkdir(_path,callback){ if(fs.existsSync(_path)){ console.log(`${_path}目录已存在`) }else{ fs.mkdir(_path,(error)=>{ if(error){ return console.log(`创建${_path}目录失败`); } console.log(`创建${_path}目录成功`) }) } callback(); //没有生成指定目录不会执行 }
搞定代码后我就跑了一遍试试看,确保各种操作没问题。看着数据乖乖爬下来存好,心里美滋滋的。虽然项目还有不少小毛病,但对学Node.js和网页爬虫来说,这可是个重要进步!
展望未来:我的技术成长之路
//将文字内容存入txt文件中 function saveContent() { fs.writeFile('./content/content.txt',content.toString()); }
这次用cheerio的过程让我对网页抓取这块儿有了更深的理解。我觉得只要多学点,多试试,肯定能做出厉害的爬虫程序来。此外,以后我还想接着研究下Node.js的各种用法!
在这次的科技探险中,Cheerio帮我找到了一个超好用的工具,可以方便快速地判别DOM并抽出网页里的所有重要信息。希望我能把这个好东西介绍给更多对网页爬取感兴趣的朋友们。那么,大家用Cheerio或者其它类似的爬虫工具有没有遇到过什么麻烦?在下面的评论区分享下你们的困难和心得,咱们互帮互助共同进步!要是觉得我这篇文章挺有用的话,别忘了给个赞再转发出去,你们的鼓励是我继续分享的最大动力!
//下载爬到的图片 function downloadImg() { imgs.forEach((imgUrl,index) => { //获取图片名 let imgName = imgUrl.split('/').pop(); //下载图片存放到指定目录 let stream = fs.createWriteStream(`./imgs/${imgName}`); let req = request.get('https:' + imgUrl); //响应流 req.pipe(stream); console.log(`开始下载图片 https:${imgUrl} --> ./imgs/${imgName}`); } ) }
评论0