Node批量爬取头条视频并保存方法

简介

一般批量爬取视频或者图片的套路是,使用爬虫获得文件链接集合,然后通过 writeFile 等方法逐个保存文件。然而,头条的视频,在需要爬取的 html 文件(服务端渲染输出)中,无法捕捉视频链接。视频链接是页面在客户端渲染时,通过某些 js 文件内的算法或者解密方法,根据视频的已知 key 或者 hash 值,动态计算出来并添加到 video 标签的。这也是网站的一种反爬措施。

我们在浏览这些页面时,通过审核元素,可以看到计算后的文件地址。然而在批量下载时,逐个手动的获取视频链接显然不可取。开心的是,puppeteer 提供了模拟访问 Chrome 的功能,使我们可以爬取经过浏览器渲染出来的最终页面。

项目启动

命令

npm i
npm start

Notice: 安装 puppeteer 的过程稍慢,耐心等待。

配置文件

// 配置相关
module.exports = {
 originPath: 'https://www.ixigua.com', // 页面请求地址
 savePath: 'D:/videoZZ' // 存放路径
}

技术点

puppeteer

官方API

puppeteer 提供一个高级 API 来控制 Chrome 或者 Chromium。

puppeteer 主要作用:

利用网页生成 PDF、图片

爬取SPA应用,并生成预渲染内容(即“SSR” 服务端渲染)

可以从网站抓取内容

自动化表单提交、UI测试、键盘输入等

使用到的 API:

puppeteer.launch() 启动浏览器实例

browser.newPage() 创建一个新页面

page.goto() 进入指定网页

page.screenshot() 截图

page.waitFor() 页面等待,可以是时间、某个元素、某个函数

page.$eval() 获取一个指定元素,相当于 document.querySelector

page.$$eval() 获取某类元素,相当于 document.querySelectorAll

page.$('#id .className') 获取文档中的某个元素,操作类似jQuery

代码示例

const puppeteer = require('puppeteer');

(async () => {
 const browser = await puppeteer.launch();
 const page = await browser.newPage();
 await page.goto('https://example.com');
 await page.screenshot({path: 'example.png'});

 await browser.close();
})();

视频文件下载方法

下载视频主方法

const downloadVideo = async video => {
 // 判断视频文件是否已经下载
 if (!fs.existsSync(`${config.savePath}/${video.title}.mp4`)) {
 await getVideoData(video.src, 'binary').then(fileData => {
  console.log('下载视频中:', video.title)
  savefileToPath(video.title, fileData).then(res =>
  console.log(`${res}: ${video.title}`)
  )
 })
 } else {
 console.log(`视频文件已存在:${video.title}`)
 }
}

获取视频数据

getVideoData (url, encoding) {
 return new Promise((resolve, reject) => {
 let req = http.get(url, function (res) {
  let result = ''
  encoding && res.setEncoding(encoding)
  res.on('data', function (d) {
  result += d
  })
  res.on('end', function () {
  resolve(result)
  })
  res.on('error', function (e) {
  reject(e)
  })
 })
 req.end()
 })
}

将视频数据保存到本地

savefileToPath (fileName, fileData) {
 let fileFullName = `${config.savePath}/${fileName}.mp4`
 return new Promise((resolve, reject) => {
 fs.writeFile(fileFullName, fileData, 'binary', function (err) {
  if (err) {
  console.log('savefileToPath error:', err)
  }
  resolve('已下载')
 })
 })
}

目标网站:西瓜视频

项目功能:下载头条号【维辰财经】下的最新20个视频

项目地址:Github 地址

(0)

相关推荐

  • Nodejs把接收图片base64格式保存为文件存储到服务器上

    下面一小段代码给大家分享Nodejs把接收图片base64格式保存为文件存储到服务器上的方法,具体代码如下所示: app.post('/upload', function(req, res){ //接收前台POST过来的base64 var imgData = req.body.imgData; //过滤data:URL var base64Data = imgData.replace(/^data:image\/\w+;base64,/, ""); var dataBuffer =

  • Node.js模拟发起http请求从异步转同步的5种用法

    使用 Node.js 模拟发起 http 请求很常用的,但是由于 Node 模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库 API 从异步转同步的几种方法.模块有: request , request-promise , request-promise-native , request-promise-any PS: Node的版本>=8.0.0 为了使用 Async / Await PS: 这里加入 auth 字段是为了需要用户

  • node.js环境搭建图文详解

    身为一名Java开发者对前端充满无限的好奇,于是开始踏入前端的领地.要想先学习,搭建环境是必备,所以整理一篇node.js环境搭建教程. Node.js 是一个让 JavaScript 运行在服务端的开发平台 官网https://nodejs.org 下载 下载地址https://nodejs.org/en/download/ 本次下载LTS长期支持版,.zip解压版本(当然也可以使用安装版.msi),点击右侧[64-bit]即可下载. 解压 解压到自己所要存放的文件夹中,如图: 解压完成后会有

  • node.js调用C++函数的方法示例

    目前nodejs调用c++主流的有两种方法,分别是addons和ffi addons是nodejs官方的c++扩展实现方案,但是由于需要使用模版,并且要对v8引擎有一定的了解,入门门槛较高. ffi是nodejs直接调用so库的一种实现,可以调用纯c的接口. 要想node.js调用C++的函数等,须先将C++代码编译成二进制的.node文件.node.js官方文档https://nodejs.org/dist/latest-v8.x/docs/api/addons.html中的C++ addon

  • node.js使用redis储存session的方法

    转储session的原因 网上有许多session需要用数据库储存的原因,对我来说原因很简单,仅仅只是node的生产环境不允许将session存到服务器的内存中.会报一个内存溢出的风险警告.所以我决定将session转储到数据库中.而用于存储session的方案有许多,这里由于本人比较菜,所以选择了主流的redis来保存我的session状态 安装redis 首先既然要使用redis,那么第一步当然是将redis安装到服务器上,服务器一般都是linux的操作系统. 所以下面是linux的安装步骤

  • 详解node字体压缩插件font-spider的用法

    需求: 根据甲方要求,使用UI中指定字体 移动端默认显示系统默认字体,非系统默认字体需要自行引入字体包 字体包过大,字体包通常在几MB,严重拖累页面加载速度 分析: 文本内容为固定内容,不需要更新 文本内容大多为常用文字,大多文字用不上 插件: font-spider node 安装插件方法:npm install font-spider -g 操作: 安装插件 提取项目文字: 创建一个临时html,将所有项目需要用到的文本放到html中 在htmnl中写入样式代码,举个栗子: @font-fa

  • Node批量爬取头条视频并保存方法

    简介 一般批量爬取视频或者图片的套路是,使用爬虫获得文件链接集合,然后通过 writeFile 等方法逐个保存文件.然而,头条的视频,在需要爬取的 html 文件(服务端渲染输出)中,无法捕捉视频链接.视频链接是页面在客户端渲染时,通过某些 js 文件内的算法或者解密方法,根据视频的已知 key 或者 hash 值,动态计算出来并添加到 video 标签的.这也是网站的一种反爬措施. 我们在浏览这些页面时,通过审核元素,可以看到计算后的文件地址.然而在批量下载时,逐个手动的获取视频链接显然不可取

  • Python爬虫 批量爬取下载抖音视频代码实例

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目源码展示: ''' 在学习过程中有什么不懂得可以加我的 python学习交流扣扣qun,934109170 群里有不错的学习教程.开发工具与电子书籍. 与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容. ''' # -*- coding:utf-8 -*- from contextlib import closing import request

  • python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import asyncio import aiohttp headers = { 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) ' 'Ve

  • Python 爬虫批量爬取网页图片保存到本地的实现代码

    其实和爬取普通数据本质一样,不过我们直接爬取数据会直接返回,爬取图片需要处理成二进制数据保存成图片格式(.jpg,.png等)的数据文本. 现在贴一个url=https://img.ivsky.com/img/tupian/t/201008/05/bianxingjingang-001.jpg 请复制上面的url直接在某个浏览器打开,你会看到如下内容: 这就是通过网页访问到的该网站的该图片,于是我们可以直接利用requests模块,进行这个图片的请求,于是这个网站便会返回给我们该图片的数据,我们

  • Python爬虫进阶之爬取某视频并下载的实现

    这几天在家闲得无聊,意外的挖掘到了一个资源网站(你懂得),但是网速慢广告多下载不了种种原因让我突然萌生了爬虫的想法. 下面说说流程: 一.网站分析 首先进入网站,F12检查,本来以为这种低端网站很好爬取,是我太低估了web主.可以看到我刷新网页之后,出现了很多js文件,并且响应获取的代码与源代码不一样,这就不难猜到这个网站是动态加载页面. 目前我知道的动态网页爬取的方法只有这两种:1.从网页响应中找到JS脚本返回的JSON数据:2.使用Selenium对网页进行模拟访问.源代码问题好解决,重要的

  • Python 超简洁且详细爬取西瓜视频案例

    一.写在前面 真的,为什么别人发游戏这么多人看,我发了两次了加起来才一百个. 算了算了,不整游戏了,反正你们也不爱看~ 今天来试试把头条上扭腰上热门的那些妹子爬一爬,不知道我顶不顶得住~ 二.准备工作 1.使用的环境 python 3.8pycharm 2021.2 专业版 2.要用的第三方模块 seleniumrequestsparsel 三.大致流程 鉴于你们不喜欢我啰嗦,但是流程呢,我还是要给你们写出来,所以我就单独把它列出来了. 1.网站分析(明确需求) 在视频网页源代码当中找到 emb

  • Python 超简洁且详细爬取西瓜视频案例

    一.写在前面 真的,为什么别人发游戏这么多人看,我发了两次了加起来才一百个. 算了算了,不整游戏了,反正你们也不爱看~ 今天来试试把头条上扭腰上热门的那些妹子爬一爬,不知道我顶不顶得住~ 二.准备工作 1.使用的环境 python 3.8 pycharm 2021.2 专业版 2.要用的第三方模块 selenium requests parsel 三.大致流程 鉴于你们不喜欢我啰嗦,但是流程呢,我还是要给你们写出来,所以我就单独把它列出来了. 1.网站分析(明确需求) 在视频网页源代码当中找到

  • python爬虫爬取快手视频多线程下载功能

    环境: python 2.7 + win10 工具:fiddler postman 安卓模拟器 首先,打开fiddler,fiddler作为http/https 抓包神器,这里就不多介绍. 配置允许https 配置允许远程连接 也就是打开http代理 电脑ip: 192.168.1.110 然后 确保手机和电脑是在一个局域网下,可以通信.由于我这边没有安卓手机,就用了安卓模拟器代替,效果一样的. 打开手机浏览器,输入192.168.1.110:8888   也就是设置的代理地址,安装证书之后才能

  • 如何使用Node.js爬取任意网页资源并输出PDF文件到本地

    需求: 使用Node.js爬取网页资源,开箱即用的配置 将爬取到的网页内容以PDF格式输出 如果你是一名技术人员,那么可以看我接下来的文章,否则,请直接移步到我的github仓库,直接看文档使用即可 仓库地址:附带文档和源码 本需求使用到的技术:Node.js和puppeteer puppeteer 官网地址: puppeteer地址 Node.js官网地址:链接描述 Puppeteer是谷歌官方出品的一个通过DevTools协议控制headless Chrome的Node库.可以通过Puppe

  • Python爬取梨视频的示例

    爬取流程(美食区最热标签下的三个视频) 在首页获取视频的编号和名字 拼接成正确的url 保存视频 思路 1.从网页中获取视频的url 发现视频的url在id为"JprismPlayer"的div标签下的video标签src属性中,xpath解析网页 video_url = tree.xpath("//div[@id='JprismPlayer']/video/@src") 但得到的返回值为空,也就是说这个video标签在原网页中并不存在,很可能是动态加载出来的 2.

随机推荐