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 cdn使用介绍
May 08 Javascript
封装html的select标签的js操作实例
Jul 02 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
Nov 27 Javascript
js实现九宫格拼图小游戏
Feb 13 Javascript
浅谈react 同构之样式直出
Nov 07 Javascript
js正则表达式校验指定字符串的方法
Jul 23 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 Javascript
bootstrap 路径导航 分页 进度条的实例代码
Aug 06 Javascript
element-ui 设置菜单栏展开的方法
Aug 22 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
Sep 16 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
Sep 27 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
Jul 16 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与javascript对多项选择的处理
2006/10/09 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
python扫描线填充算法详解
2020/02/19 Python
详解Python模块化编程与装饰器
2021/01/16 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
毕业生求职推荐信
2013/11/04 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
初婚初育证明范本
2014/11/24 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书