利用node.js写一个爬取知乎妹纸图的小爬虫

发布时间 - 2026-01-11 00:57:18    点击率:

前言

说起写node爬虫的原因,真是羞羞呀。一天,和往常一样,晚上吃过饭便刷起知乎来,首页便是推荐的你见过最漂亮的女生长什么样?,点进去各种漂亮的妹纸爆照啊!!!,看的我好想把这些好看的妹纸照片都存下来啊!一张张点击保存,就在第18张得时候,突然想起。我特么不是程序员么,这种手动做的事,怎么能做,不行我不能丢程序员的脸了,于是便开始这次爬虫之旅。

原理

初入爬虫的坑,没有太多深奥的理论知识,要获取知乎上帖子中的一张图片,我把它归结为以下几步。

  • 准备一个url(当然是诸如你见过最漂亮的女生长什么样?)
  • 获取这个url的html内容,并分析其中的dom结构,遍历找到这些漂亮的妹纸图片url
  • 获取图片内容
  • 将图片内容写入本地文件

开始动手

大概知道原理之后我们就可以开干了

准备一个url

这个最简单了,去知乎随便一搜就是一大把,我们以

发一张你认为很漂亮的|美女|照片?

为例子,先来分析一下这个页面的dom结构,其实很简单,知乎的一个页面中会包含很多种类型的图片,有头像,用户评价上传的图片啥的。基本上在noscript种都可以找到对应的图片地址。

获取这个url的html内容,并且拿到当前页面noscript中的img链接

这一步我们需要会点简单的nodejs的知识,以及用到一个库叫cheerio,这个库具体是用来做什么的,详细请移步cheerio。

简单来说就是可以在命令行中使用jQuery来搜索遍历获取相应的元素。

那么怎样才能获取这个帖子的html呢

使用nodejs的https模块

var https = require('https')
getAllHtml (url, callback) {
 let sHtml = '',
 _this = this;
 https.get(url, (res) => {
 res.on('data', (data) => {
 sHtml += data;
 });
 res.on('end', () => {
 callback.bind(_this, sHtml)();
 })
 }).on('error', (err) => {
 console.log(err);
 });
}

通过以上操作拿到网站的html之后,便是遍历出我们需要的图片地址来了

filterHtml (sHtml, filePath) {
 let $ = cheerio.load(sHtml), // 将上一步拿到的网站html传入cheerio.load,便得到类似于包装过的jQuery对象,可以像jQuey的选择器一样来选择元素
 $Imgs = $('noscript img'),
 imgData = [],
 _this = this;
 $Imgs.each((i, e) => {
 let imgUrl = $(e).attr('src'); //取出对应的url
 imgData.push(imgUrl);
 // 将url传入开始下载
 _this.downloadImg(imgUrl, _this.filePath, 
 function (err) {
 console.log(imgUrl + 'has be down');
 });
 });
 console.log(imgData);
}

有了图片的url,如何下载到本地呢?

我们需要使用request这个库,简单的调用一下api再结合node原生写文件的api。

downloadImg (imgUrl, filePath, callback) {
 let fileName = this.parseFileName(imgUrl);
 request(imgUrl).pipe(fs.createWriteStream('./' + filePath + '/'+fileName)).on('close', callback && callback);
 }

到这里就大功告成了,是不是很简单!!!已经将源码上传,欢迎大家下载查看。

gitHub地址:https://github.com/qianlongo/node-small-crawler

本地下载地址:http://xiazai./201705/yuanma/node-small-crawler().rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用node.js能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# nodejs爬取动态页面  # nodejs爬虫抓取知乎  # nodejs 爬取页面  # node.js实现简单爬虫示例详解  # node.js做一个简单的爬虫案例教程  # node.js爬虫框架node-crawler初体验  # Node.js爬虫如何获取天气和每日问候详解  # 基于node.js实现爬虫的讲解  # node.js学习笔记之koa框架和简单爬虫练习  # 浅谈Node.js爬虫之网页请求模块  # 使用 Node.js 开发资讯爬虫流程  # 基于node.js制作简单爬虫教程  # node.js爬虫爬取拉勾网职位信息  # Node.js 实现简单爬虫的示例代码  # 遍历  # 见过  # 最漂亮  # 上传  # 来了  # 就在  # 本地下载  # 做什么  # 把它  # 之旅  # 很简单  # 大功告成  # 欢迎大家  # 我好  # 这篇文章  # 几步  # 你认为  # 很漂亮  # 想把  # 能做 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用PHP快速搭建高效网站?分步指南  如何在阿里云服务器自主搭建网站?  实例解析angularjs的filter过滤器  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  教你用AI将一段旋律扩展成一首完整的曲子  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  如何快速查询网址的建站时间与历史轨迹?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel如何创建自定义Artisan命令?(代码示例)  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel模型事件有哪些_Laravel Model Event生命周期详解  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  JS碰撞运动实现方法详解  Laravel如何配置Horizon来管理队列?(安装和使用)  如何用西部建站助手快速创建专业网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  如何用花生壳三步快速搭建专属网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  网站图片在线制作软件,怎么在图片上做链接?  如何构建满足综合性能需求的优质建站方案?  如何正确选择百度移动适配建站域名?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  重庆市网站制作公司,重庆招聘网站哪个好?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  js代码实现下拉菜单【推荐】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  如何获取上海专业网站定制建站电话?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置