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


Posted in Javascript onSeptember 20, 2018

简介

一般批量爬取视频或者图片的套路是,使用爬虫获得文件链接集合,然后通过 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 地址

Javascript 相关文章推荐
翻译整理的jQuery使用查询手册
Mar 07 Javascript
Jquery Ajax Error 调试错误的技巧
Nov 20 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
Nov 01 Javascript
Bootstrap面板使用方法
Jan 16 Javascript
浅谈JavaScript异步编程
Jan 20 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
May 02 Javascript
vue-cli 构建骨架屏的方法示例
Nov 08 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
Sep 19 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
Oct 28 Javascript
vue 本地环境跨域请求proxyTable的方法
Sep 19 #Javascript
vue 优化CDN加速的方法示例
Sep 19 #Javascript
Vue前后端不同端口的实现方法
Sep 19 #Javascript
vue-cli 3.x 修改dist路径的方法
Sep 19 #Javascript
浅谈React之状态(State)
Sep 19 #Javascript
jQuery使用each遍历循环的方法
Sep 19 #jQuery
vue新vue-cli3环境配置和模拟json数据的实例
Sep 19 #Javascript
You might like
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP多文件上传实例
2015/07/09 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
jquery tools系列 expose 学习
2009/09/06 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
node Buffer缓存区常见操作示例
2019/05/04 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
Django用户认证系统 User对象解析
2019/08/02 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
银行求职推荐信范文
2013/11/30 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
主题团日活动总结
2014/06/25 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
2016年党建工作简报
2015/11/26 职场文书
八年级作文之友谊
2019/12/02 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python