网页视频抓取脚本(配置文件技术点puppeteer官方APIpuppeteer提供一个高级API来控制Chrome或者Chromium)

优采云 发布时间: 2022-01-26 02:03

  网页视频抓取脚本(配置文件技术点puppeteer官方APIpuppeteer提供一个高级API来控制Chrome或者Chromium)

  介绍

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线