用TypeScript和library needle来创建视频爬虫程序

news/2025/3/14 15:57:55/

使用 TypeScript 和 needle 库创建视频爬虫程序的过程可以按照以下步骤进行。needle 是一个轻量级的 HTTP 请求库,适用于进行网络请求。

在这里插入图片描述

步骤:

  1. 安装依赖
    你需要安装 needle 来发送 HTTP 请求,以及一些额外的库来帮助处理 HTML 数据(比如 cheerio 用于解析 HTML)。

    执行以下命令来安装依赖:

    npm install needle cheerio
    npm install --save-dev typescript @types/node
    
  2. 设置 TypeScript 配置
    在项目根目录下创建一个 tsconfig.json 文件:

    {"compilerOptions": {"target": "ES6","module": "commonjs","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true}
    }
    
  3. 创建 TypeScript 文件
    创建一个 TypeScript 文件 videoScraper.ts,并编写代码。

代码示例:

typescript">import needle from 'needle';
import cheerio from 'cheerio';
import path from 'path';
import fs from 'fs';// 下载视频函数
async function downloadVideo(videoUrl: string, filename: string): Promise<void> {console.log(`开始下载视频: ${videoUrl}`);const response = await needle('get', videoUrl, { response_type: 'buffer' });const videoData = response.body;fs.writeFileSync(path.join(__dirname, 'downloads', filename), videoData);console.log(`视频已下载并保存为: ${filename}`);
}// 抓取网页并提取视频链接
async function crawlAndDownloadVideos(url: string): Promise<void> {try {// 请求网页内容const response = await needle('get', url);const html = response.body;// 使用 cheerio 解析 HTML 内容const $ = cheerio.load(html);// 提取所有的视频链接,这里假设视频链接存放在 <video> 标签的 src 属性中const videoUrls: string[] = [];$('video').each((i, element) => {const videoUrl = $(element).attr('src');if (videoUrl) {// 处理相对路径的视频 URLif (!videoUrl.startsWith('http')) {const absoluteUrl = new URL(videoUrl, url).href;videoUrls.push(absoluteUrl);} else {videoUrls.push(videoUrl);}}});// 创建下载文件夹(如果没有的话)const downloadDir = path.join(__dirname, 'downloads');if (!fs.existsSync(downloadDir)) {fs.mkdirSync(downloadDir);}// 下载所有视频for (let i = 0; i < videoUrls.length; i++) {const videoUrl = videoUrls[i];const filename = `video_${i + 1}.mp4`; // 设置视频文件名await downloadVideo(videoUrl, filename);}} catch (error) {console.error('抓取过程中发生错误:', error);}
}// 主函数
const url = 'https://example.com';  // 替换为你想抓取的网页
crawlAndDownloadVideos(url);

代码说明:

  1. downloadVideo 函数

    • 此函数负责下载视频。它通过 needle 发送 GET 请求,并将响应数据(视频流)保存到本地文件系统。
    • 通过 needle('get', videoUrl, { response_type: 'buffer' }) 获取视频流数据,然后使用 fs.writeFileSync 将其保存到本地文件系统。
  2. crawlAndDownloadVideos 函数

    • 此函数发送请求以获取网页的 HTML 内容,并使用 cheerio 解析它。
    • 它从 <video> 标签中提取 src 属性,即视频文件的 URL。然后处理每个视频 URL,确保它是一个绝对路径,最后将其添加到 videoUrls 数组。
    • 对于每个视频链接,调用 downloadVideo 函数进行下载。
  3. cheerio

    • cheerio 用于解析网页并提取 <video> 标签的 src 属性。我们假设视频 URL 位于 <video> 标签中的 src 属性,如果网站的结构不同,你可能需要根据实际情况调整选择器。
  4. 处理相对路径的 URL

    • 如果视频链接是相对路径,我们通过 new URL(videoUrl, url) 转换为绝对路径。
  5. 视频保存

    • 视频被下载并保存到当前目录下的 downloads 文件夹。

执行程序

  1. 将上述代码保存为 videoScraper.ts

  2. 通过 TypeScript 编译器将其编译为 JavaScript:

    tsc videoScraper.ts
    
  3. 运行编译后的 JavaScript 文件:

    node videoScraper.js
    

总结

这个爬虫程序会抓取指定网页中的视频资源,并将视频下载到本地。在本例中,视频链接被假设为存在于 <video> 标签的 src 属性中。你可以根据实际的网页结构调整 cheerio 选择器。


http://www.ppmy.cn/news/1579088.html

相关文章

Java 实现 Android ViewPager2 顶部导航:动态配置与高效加载指南

Java 实现&#xff1a;明确使用的编程语言。Android ViewPager2&#xff1a;技术栈和核心组件。顶部导航&#xff1a;功能点。动态配置与高效加载指南&#xff1a;突出动态配置的灵活性和性能优化的重点。 在 Android 中使用 Java 实现 ViewPager2 和 TabLayout 的顶部导航也是…

【抽奖项目】|第三篇

前言&#xff1a; 高并发的活动预热肯定不可以在数据库操作&#xff0c;需要redis&#xff0c;特别是这种秒杀活动更是需要注意&#xff0c;所以可以在高并发的前夕先进行活动预热。 上一篇写完了怎么样活动预热&#xff0c;可以看看这篇写怎么样高并发抽奖接口 【抽奖项目】|第…

神经网络为什么要用 ReLU 增加非线性?

在神经网络中使用 ReLU&#xff08;Rectified Linear Unit&#xff09; 作为激活函数的主要目的是引入非线性&#xff0c;这是神经网络能够学习复杂模式和解决非线性问题的关键。 1. 为什么需要非线性&#xff1f; 1.1 线性模型的局限性 如果神经网络只使用线性激活函数&…

当AI回答问题时,它的“大脑”里在炒什么菜?

文章目录 1. 拆解订单&#xff1a;AI如何听懂你的“暗号”&#xff1f;2. 调用工具&#xff1a;AI的“万能工具箱”里有什么&#xff1f;3. 知识不够&#xff1f;去“图书馆”现学现卖&#xff01;4. 人类的秘密武器&#xff1a;给AI戴上“镣铐”5. 为什么AI会“胡言乱语”&…

VSCode 搭建C++编程环境 2025新版图文安装教程(100%搭建成功,VSCode安装+C++环境搭建+运行测试+背景图设置)

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、VScode下载及安装二、安装 MinGW-w64 工具链三、Windows环境变量配置四、检查 M…

【面试题系列】 Redis 核心面试题(二)答案

本文主要介绍Redis 的面试题&#xff0c;涵盖持久化、集群、缓存策略、事务等方面 一、持久化机制 1. RDB 与 AOF 的核心区别及适用场景&#xff1f; 答案&#xff1a; 特性RDBAOF存储内容内存快照&#xff08;二进制文件&#xff09;写命令日志&#xff08;文本格式&#x…

QT:非模态使用WA_DeleteOnClose避免内存泄漏

connect(ui->actionnewFile,&QAction::triggered,this,[](){QDialog*dlg new QDialog(this);//dlg.exec();dlg->show();dlg->setAttribute(Qt::WA_DeleteOnClose);qDebug()<<"打开对话框";}); 1. QDialog* dlg new QDialog(this); - 创建了…

MCP服务协议详细介绍

MCP服务的详细介绍如下&#xff1a; 1. MCP协议概述 MCP&#xff08;Model Context Protocol&#xff09;是一种开放协议&#xff0c;旨在连接大型语言模型&#xff08;LLMs&#xff09;与外部数据源或工具。通过标准化接口&#xff0c;MCP使AI模型能够安全地与本地和远程资源…