网页视频抓取脚本( 2018年09月20日08:37:03投稿:laozhang爬取头条)
优采云 发布时间: 2022-02-23 07:27网页视频抓取脚本(
2018年09月20日08:37:03投稿:laozhang爬取头条)
节点批量抓取头条视频并保存方法
更新时间:2018-09-20 08:37:03 投稿:老张
在这篇文章中,我们介绍节点抓取头条视频并批量保存的方法。有需要的朋友可以测试以下。
介绍
批量爬取视频或图片的一般套路是使用爬虫获取一组文件链接,然后通过writeFile等方法将文件一个一个保存。但是,头条的视频无法捕捉到需要爬取的html文件(服务器端渲染输出)中的视频链接。视频链接是在客户端渲染页面时,通过一些js文件中的算法或解密方法,根据视频的已知key或hash值,动态计算并添加到video标签中的。这也是网站的防爬措施。
当我们浏览这些页面时,我们可以通过审计元素看到计算出来的文件地址。但是,在批量下载的时候,手动一个一个的获取视频链接显然是不可取的。令人高兴的是,puppeteer 提供了模拟访问 Chrome 的能力,允许我们抓取浏览器呈现的最终页面。
项目开始
命令
npm i
npm start
注意:安装puppeteer的过程有点慢,请耐心等待。
配置文件
// 配置相关
module.exports = {
originPath: 'https://www.ixigua.com', // 页面请求地址
savePath: 'D:/videoZZ' // 存放路径
}
技术点
傀儡师
官方 API
puppeteer 提供了一个高级 API 来控制 Chrome 或 Chromium。
傀儡师的主要作用:
从网页生成 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地址