分享一个node写的爬虫
相关文档
通用函数版本
import cheerio from 'cheerio'
import puppeteer from 'puppeteer'
export const getDouyinVideo = async function getDouyinVideoInfo(videoUrl: string) {
const browser = await puppeteer.launch()
const page = await browser.newPage()
const videoSource = videoUrl
// 设置页面的视图端口大小
await page.setViewport({
width: 375, // iPhone X 宽度
height: 812, // iPhone X 高度
deviceScaleFactor: 2, // 设备缩放因子,iPhone X 是 2x 视网膜屏幕
isMobile: true, // 标记为移动设备
hasTouch: true // 支持触摸
})
// 设置用户代理
await page.setUserAgent(
'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1'
)
try {
// 导航到视频页面
await page.goto(videoSource, { waitUntil: 'networkidle2' })
// 获取页面内容
const html = await page.content()
const $ = cheerio.load(html)
// 提取封面
const cover = $('.video-container .poster', html).attr('src')
// 提取视频标题
const title = $('title').text()
// 提取视频关键词
const keywords = $('meta[name="keywords"]').attr('content')
// 提取视频描述
const description = $('meta[name="description"]').attr('content')
return { cover, title, keywords, description }
} catch (error) {
console.error('获取视频信息失败:', error)
} finally {
await browser.close() // 确保关闭浏览器
}
}
终端运行版本
const puppeteer = require("puppeteer");
const cheerio = require("cheerio");
const readline = require("readline");
// 创建接口以便从终端读取输入
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
async function getDouyinVideoInfo(videoUrl) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// 设置页面的视图端口大小
await page.setViewport({
width: 375, // iPhone X 宽度
height: 812, // iPhone X 高度
deviceScaleFactor: 2, // 设备缩放因子,iPhone X 是 2x 视网膜屏幕
isMobile: true, // 标记为移动设备
hasTouch: true, // 支持触摸
});
// 设置用户代理
await page.setUserAgent(
"Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1"
);
try {
// 导航到视频页面
await page.goto(videoUrl, { waitUntil: "networkidle2" });
// 获取页面内容
const html = await page.content();
const $ = cheerio.load(html);
// pc
// // 提取封面
// const cover = $('meta[name="lark:url:video_cover_image_url"]').attr(
// "content"
// );
// const cover_m = $(".video-container .poster", html);
// console.log(cover_m.attr("src"));
// // 提取视频iframe地址
// const iframe_url = $('meta[name="lark:url:video_iframe_url"]').attr(
// "content"
// );
// // 提取视频标题
// const title = $('meta[name="lark:url:video_title"]').attr("content");
// // 提取视频关键词
// const keywords = $('meta[name="keywords"]').attr("content");
// // 提取视频描述
// const description = $('meta[name="description"]').attr("content");
// // 提取视频来源
// const source = $('meta[name="lark:url:video_brand_name"]').attr("content");
// 移动端
// 提取封面
const cover = $(".video-container .poster", html).attr("src");
// 提取视频标题
const title = $("title").text();
// 提取视频关键词
const keywords = $('meta[name="keywords"]').attr("content");
// 提取视频描述
const description = $('meta[name="description"]').attr("content");
return { cover, title, keywords, description, source, iframe_url };
} catch (error) {
console.error("获取视频信息失败:", error);
} finally {
await browser.close(); // 确保关闭浏览器
}
}
// 提示用户输入视频链接
rl.question("请输入视频链接: ", async (original) => {
// 显示正在提取的动画效果
const loadingText = "🚀正在提取";
let loadingAnimation = "";
const loadingInterval = setInterval(() => {
process.stdout.write(`\r${loadingText}${loadingAnimation}`);
loadingAnimation =
loadingAnimation.length < 3 ? loadingAnimation + "." : "";
}, 500);
const info = await getDouyinVideoInfo(original);
// 清除动画效果
clearInterval(loadingInterval);
console.log("\r✅提取完成\n");
// 显示提取的信息
console.log("视频封面:", info.cover);
console.log("视频标题:", info.title);
console.log("视频关键词:", info.keywords);
console.log("视频描述:", info.description);
console.log("视频来源:", info.source);
console.log("视频地址:", info.iframe_url);
rl.close(); // 关闭 readline 接口
});
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。