以下是“Node批量爬取头条视频并保存方法”的完整攻略:
1. 准备工作
首先,需要确保已经安装了Node.js和npm。然后,安装所需的依赖模块:cheerio
和request-promise
。安装命令如下:
npm install cheerio request-promise
2. 获取视频列表
爬取头条视频,需要先获取视频列表。可以通过头条的API接口来获取,其中涉及到API接口的请求和解析,代码如下:
const rp = require('request-promise');
const cheerio = require('cheerio');
const apiUrl = 'https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E8%A7%86%E9%A2%91&autoload=true&count=20&en_qc=1&cur_tab=3&from=search_tab&pd=synthesis×tamp=';
// 获取视频列表
const getVideoList = async () => {
try {
const timestamp = new Date().getTime(); // 当前时间戳
const options = { url: apiUrl + timestamp, json: true };
const res = await rp(options);
const videoList = res.data.filter(item => item.title && item.has_video === true); // 仅保留有标题且有视频的数据项
return videoList;
} catch (err) {
console.log(err);
}
}
module.exports = {
getVideoList
};
3. 解析视频详情并保存视频
对于一个视频详情页,我们需要解析出视频的真实地址,并下载保存到本地。这里使用到了正则表达式和字符串截取等技巧。代码如下:
const rp = require('request-promise');
const cheerio = require('cheerio');
const fs = require('fs');
const path = require('path');
// 获取视频列表
// ...
// 解析视频详情并保存视频
const parseVideoDetail = async (video) => {
try {
const url = video.video_detail_info.detail_video_large_image.url;
const videoHtml = await rp('https:' + url);
const regExp = /<script>window\.\_\_INIT\_DATA\_\_ = (.*?)<\/script>/g;
const match = regExp.exec(videoHtml);
const dataJsonStr = match[1];
const dataJson = JSON.parse(dataJsonStr);
const videoUrl = dataJson.video.video_download.addr[0];
const videoFileName = video.group_id + '_' + video.item_id + '.mp4';
const videoPath = path.join(__dirname, 'videos', videoFileName);
const videoStream = fs.createWriteStream(videoPath);
const options = {
url: 'https:' + videoUrl,
headers: { 'User-Agent': 'Mozilla/5.0' }
};
return new Promise(resolve => {
rp(options).pipe(videoStream).on('close', resolve);
});
} catch (err) {
console.log(err);
}
};
module.exports = {
getVideoList,
parseVideoDetail
};
4. 完整示例
结合上面的代码段,我们可以写出一个完整的批量爬取头条视频并保存的Node.js程序。其中,先调用getVideoList
获取视频列表,然后遍历列表调用parseVideoDetail
解析视频详情并保存视频。如下是一个简单的示例程序:
const { getVideoList, parseVideoDetail } = require('./crawler');
// 执行爬虫
(async () => {
const videoList = await getVideoList();
console.log(`共找到${videoList.length}个视频`);
for (let video of videoList) {
await parseVideoDetail(video);
console.log(`已下载[${video.title}]`);
}
})();
示例说明一
假设爬取的是关键词为“小猫咪”的头条视频并保存到本地。
首先,修改apiUrl
为搜索“小猫咪”的头条API接口:
const apiUrl = 'https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E5%B0%8F%E7%8C%AB%E5%92%AA&autoload=true&count=20&en_qc=1&cur_tab=3&from=search_tab&pd=synthesis×tamp=';
然后,将视频名字修改为中文:
const videoFileName = video.title.replace(/[^\u4e00-\u9fa5\w]/g, '') + '_' + video.group_id + '.mp4';
这样就能够爬取名为“小猫咪”的头条视频并保存到本地。
示例说明二
假如我们只想要下载点赞数超过10万的头条视频,那么可以在获取视频列表的代码中进行过滤:
const videoList = res.data
.filter(item => item.title && item.has_video === true && item.digg_count >= 100000);
这样就只会下载点赞数超过10万的头条视频了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node批量爬取头条视频并保存方法 - Python技术站