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 相关文章推荐
javascript阻止浏览器后退事件防止误操作清空表单
Nov 22 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
Aug 30 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
简介AngularJS的HTML DOM支持情况
Jun 17 Javascript
编写高性能Javascript代码的N条建议
Oct 12 Javascript
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
Vue项目中Api的组织和返回数据处理的操作
Nov 04 Javascript
JS实现随机抽取三人
Nov 06 Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
Javascript Symbol原理及使用方法解析
Oct 22 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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
jquery div拖动效果示例代码
2013/12/08 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
python中管道用法入门实例
2015/06/04 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
总经理司机岗位职责
2014/02/06 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
微笑服务标语
2014/06/24 职场文书
个人投资合作协议书
2014/10/12 职场文书
消防安全月活动总结
2015/05/08 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
家属联谊会致辞
2015/07/31 职场文书
2016年端午节寄语
2015/12/04 职场文书
《春酒》教学反思
2016/02/22 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang