当前位置: 首页 > news >正文

node.js 爬虫图片下载

主程序文件 app.js

运行主程序前需要先安装使用到的模块: npm install superagent --save
axios要安装指定版,安装最新版会报错:npm install axios@0.19.2 --save

const {default: axios} = require('axios');
const fs = require('fs');
const superagent = require('superagent');
const charset = require('superagent-charset');
charset(superagent);
const cheerio = require('cheerio');
const express = require('express');
const app = express();var baseUrl = 'https://www.qqtn.com/'; //目标网站// 访问地址示例 http://127.0.0.1:8081/index?page=6
app.get('/index', function(req, res) {//设置请求头res.header("Access-Control-Allow-Origin", "*");res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');res.header("Access-Control-Allow-Headers", "X-Requested-With");res.header('Access-Control-Allow-Headers', 'Content-Type');//解析网址传递的类型var type = req.query.type;//解析网址传递的页码var page = req.query.page;//当网址没有传值的时候设置默认值type = type || 'weixin';page = page || '1';var route = `tx/${type}tx_${page}.html`//网页页面信息是gb2312,所以chaeset应该为.charset('gb2312'),一般网页则为utf-8,可以直接使用.charset('utf-8')superagent.get(baseUrl + route).charset('gb2312').buffer(true).end(function(err, sres) {var items = [];var titelStr = '';if (err) {console.log('ERR: ' + err);res.json({code: 400,msg: err,sets: items});return;}//使用JQuery风格定义$var $ = cheerio.load(sres.text);//遍历标签提取属性值$('div.g-main-bg ul.g-gxlist-imgbox li a').each(function(idx, element) {var thumbImgSrc = $(element).find('img').attr('src');var oldtitle = $(element).attr('title');var title = oldtitle.replace(/\s*/g, ""); //去除字符串内所有的空格var href = $(element).attr('href');items.push({title: title,href: href,thumbSrc: thumbImgSrc});//标题拼接为html格式的字符串titelStr = '<li>'+title+'</li>' + titelStr//调用方法下载图片downloadFile(thumbImgSrc, title);});//发给前端//res.json({ code: 200, msg: "我是返回给前端的消息", data: items });//res.end();//读取html文件并替换内容,再发送给前端显示出来fs.readFile('./index.html',(err,data)=>{//报错则抛出错误if(err) throw err;//读取出来的内容转为字符var htmlStr = data.toString();//把 <li>%</li> 替换为拼接后的字符串var html = htmlStr.replace('<li>%</li>',titelStr);res.writeHead(200,{'Content-Type':'text/html'});res.end(html);})});
});// 下载图片的方法
async function downloadFile(uri, name) {let dir = "./imgs";//如果文件夹不存在就创建if (!fs.existsSync(dir)) {await fs.mkdirSync(dir)};//文件名let filePath = `${dir}/${name}.png`;//请求数据let res = await axios({url: uri,responseType: 'stream',});//文件流写入磁盘let ws = fs.createWriteStream(filePath);res.data.pipe(ws);res.data.on("close", () => {ws.close();});//console.log(`${name}... ...下载完成`);
};var server = app.listen(8081, function() {var host = "127.0.0.1" //server.address().addressvar port = server.address().portconsole.log(`应用实例,访问地址为 http://${host}:${port}`)
})

index.html 文件

后端爬到数据后,把结果写入index.html再返回给前端显示。

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Nodejs爬虫</title><style>li{margin-top: 10px;}</style></head><body><div style="margin-left: 10%; margin-right: 10%;"><form action="http://127.0.0.1:8081/index" method="GET"><br> 页码:<input type="text" name="page"><input type="submit" value="Submit"></form><hr /><h3>查询结果:</h3><div><!-- 使用百分号做占位符,用于nodejs操作替换实际内容 --><ul><li>%</li></ul></div></div><script></script></body>
</html>

前端请求效果图
在这里插入图片描述

后端运行效果图
在这里插入图片描述
下载到文件夹的图片
在这里插入图片描述

http://www.lryc.cn/news/97235.html

相关文章:

  • VAE-根据李宏毅视频总结的最通俗理解
  • 【LangChain】检索器之上下文压缩
  • uniapp 语音文本播报功能
  • 腾讯云高IO型云服务器CPU型号处理器主频性能
  • 【数据结构】实验八:树
  • kafka消费者api和分区分配和offset消费
  • 【驱动开发day4作业】
  • Ubuntu 20.04 Ubuntu18.04安装录屏软件Kazam
  • ADC 的初识
  • MMdetection框架速成系列 第07部分:数据增强的N种方法
  • 基于Kitti数据集的智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv5模型)
  • 4.4. 深拷贝 vs 浅拷贝
  • 网络安全(黑客)自学建议笔记
  • Linux CentOS快速安装VNC并开启服务
  • redis到底几个线程?
  • mysql修改UUID
  • NoSQL之redis配置与优化
  • Python单例模式介绍、使用
  • 1334179-85-9,BTTAA,是各种化学生物学实验中生物偶联所需
  • Linux系统中的SQL语句
  • 力扣27 26 283 844 977 移除数组
  • 【沐风老师】3DMAX自动材质插件使用方法教程
  • 让你 React 组件水平暴增的 5 个技巧
  • 阿里云部署 ChatGLM2-6B 与 langchain+ChatGLM
  • F12开发者工具的简单应用
  • 【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林
  • SpringBoot集成kafka全面实战
  • 新建Git仓库,将本地文件上传至仓库
  • 算法练习——力扣随笔【LeetCode】【C++】
  • web服务器(Tomcat)