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 相关文章推荐
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
js cookies实现简单统计访问次数
Nov 24 Javascript
使用javascript创建快捷方式的简单实例
Aug 09 Javascript
javascript模拟枚举的简单实例
Mar 06 Javascript
jQuery实现图片渐入渐出切换展示效果
Aug 15 Javascript
不间断循环滚动效果的实例代码(必看篇)
Oct 08 Javascript
基于JavaScript实现飘落星星特效
Aug 10 Javascript
从零开始最小实现react服务器渲染详解
Jan 26 Javascript
JavaScript中的连续赋值问题实例分析
Jul 12 Javascript
在vant中使用时间选择器和popup弹出层的操作
Nov 04 Javascript
js实现简单的轮播图效果
Dec 13 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
php 空格,换行,跳格使用说明
2009/12/18 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
PHP 文件上传限制问题
2019/09/01 PHP
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
js插件Jcrop自定义截取图片功能
2016/10/14 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
详解JS数值Number类型
2018/02/07 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
python实现批量改文件名称的方法
2015/05/25 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
scrapy爬虫完整实例
2018/01/25 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python 对xml解析的示例
2021/02/27 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
Julep官网:美容产品和指甲油
2017/02/25 全球购物
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
2014年大学生党员评议表自我评价
2014/09/20 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
2015年调度员工作总结
2015/04/30 职场文书
搞笑结婚保证书
2015/05/08 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript