nodejs写爬虫

javascript 复制代码
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const cheerio = require('cheerio');
const { str } = require('./dataStr');


async function getImageUrls() {
    const $ = cheerio.load(str)
    let imageUrls = [];
    $('img').each((index, element) => {
        const imgSrc = $(element).attr('src'); // 获取每张图片的源地址
        if (/^https/.test(imgSrc)) { // 判断是否为外部图片
            imageUrls.push(imgSrc);
        } else if (/^\//.test(imgSrc)) { // 判断是否为相对路径
            imageUrls.push(`https:${imgSrc}`);
        }
    });
    return imageUrls;
}

const sleep = time => {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve();
        }, time);
    })
}

async function test() {
    try {
        const urls = await getImageUrls();
        console.log('urls', urls)
        if (urls !== null) {
            for (let i = 0; i < urls.length; i++) {
                const fileName = `image_${i}.gif`; // 自定义保存图片的名称及格式
                const filePath = path.join('./images2', fileName); // 构造本地保存路径
                await sleep(1500)
                try {
                    const response = await axios({
                        method: 'get',
                        url: urls[i],
                        responseType: 'stream' // 流式传输图片数据
                    });

                    response.data.pipe(fs.createWriteStream(filePath)); // 将图片数据写入本地文件
                    console.log(`Successfully downloaded ${fileName}`);
                } catch (error) {
                    console.log(`Failed to download ${fileName}: ${error}`);
                }
            }
        }
    } catch (error) {
        console.log(error);
    }
}

test();
相关推荐
SuperEugene25 分钟前
Vue3 组合式函数(Hooks)封装规范实战:命名 / 输入输出 / 复用边界 + 避坑|Vue 组件与模板规范篇
开发语言·前端·javascript·vue.js·前端框架
cmd28 分钟前
JS深浅拷贝全解析|常用方法+手写实现+避坑指南(附完整代码)
前端·javascript
进击的尘埃29 分钟前
AbortController 实战:竞态取消、超时兜底与请求生命周期管理
前端·javascript
张一凡9330 分钟前
我用 Zustand 三年了,直到遇见 easy-model...
前端·javascript·react.js
张元清31 分钟前
React 拖拽:无需第三方库的完整方案
前端·javascript·面试
zhensherlock42 分钟前
Protocol Launcher 系列:Microsoft Edge 浏览器唤起的优雅方案
javascript·chrome·microsoft·typescript·edge·github·edge浏览器
英俊潇洒美少年1 小时前
Vue3 中 watch的 flush 选项(默认无/`post`/`sync`)的区别
前端·javascript·vue.js
D_C_tyu1 小时前
HTML | 结合Canvas开发具有智能寻路功能的贪吃蛇小游戏实战详解
javascript·算法·游戏·html·bfs
Jay-r1 小时前
樱花雨特效 WebGL实现 短视频同款浪漫视觉效果(附源码下载)
开发语言·javascript·ecmascript·编程·webgl·代码·樱花雨
凤山老林1 小时前
Js如何实现一个抽奖程序
前端·javascript·vue.js