你有没有想过,如何用AI来预测一部电影的票房?比如最近火爆的《哪吒2》,大家都在猜它会赚多少钱,但我决定不靠猜测,直接让 deepseek 来帮我做预测!
没错,这次我准备把大数据和AI相结合,用 Playwright 抓取豆瓣、淘票票、猫眼等多个平台的数据,再通过 deepseek 进行智能分析,来预测出《哪吒2》最终票房的预测。
等等,这是什么操作?!
先别急,听我慢慢给你讲。首先,我用 Playwright(对,就是那个能让你自动化浏览器操作的神器)从豆瓣、淘票票、猫眼、微博、抖音等平台上抓取实时数据,这些平台的数据对票房有着超强的预测能力。比如豆瓣的评分和评价人数,能看出观众的口碑;淘票票的想看人数,可以透露出多少人已经按捺不住想要去电影院;抖音、微博这些社交平台的热度,直接能反映出电影的火爆程度。
怎么抓取数据?
不废话了,直接上代码,告诉大家怎么抓取数据:
我们先来看下怎么在豆瓣上抓取数据:
抓取豆瓣数据
async function scrapeDouban() {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
try {
await page.goto('https://movie.douban.com/subject/34780991/');
// 豆瓣评分
const ratingLocator = page.locator('.rating_num');
// 评价人数
const votesLocator = page.locator('span[property="v:votes"]');
const rating = await ratingLocator.innerText();
const votes = await votesLocator.innerText();
console.log(`豆瓣数据 - 评分: ${rating}, 投票人数: ${votes}`);
return { rating, votes };
} catch (error) {
console.error('抓取豆瓣数据时出错:', error);
return null;
} finally {
await browser.close();
}
}
在这段代码中,我们使用Playwright模拟打开了一个Chrome浏览器,然后导航到了豆瓣中《哪吒2》的页面,接下来,我们抓取了该页面上的两个数据:豆瓣评分和评价人数
同样的道理,我们可以继续抓取其他几个平台的数据:
抓取淘票票数据
async function scrapeTaopiaopiao() {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
try {
await page.goto('https://m.taopiaopiao.com/movies/detail.html?__webview_options__=transparentTitle%3Dauto%26showProgress%3DNO%26titlePenetrate%3DNO%26so%3DNO&from=def&showid=1429839&sqm=dianying.h5.unknown.value&spm=a1z2r.7661912.nowshowing.dbuybtn_0');
// 评分
const scoreNumLocator = page.locator('.has-score-num');
// 参与评分人数
const scoreTextLocator = page.locator('.has-score-text');
// 想看人数
const wantSeeNumberLocator = page.locator('.reputation-bottom-box>span:first-child');
// 看过人数
const viewsLocator = page.locator('.reputation-bottom-box-span');
const scoreNum = await scoreNumLocator.innerText();
const scoreText = await scoreTextLocator.innerText();
const wantSeeNumber = await wantSeeNumberLocator.innerText();
const views = await viewsLocator.innerText();
console.log(`淘票票数据 - 评分: ${scoreNum}, 参与评分人数: ${scoreText}, 想看人数: ${wantSeeNumber}, 看过人数: ${views}`);
return {
scoreNum,
scoreText,
wantSeeNumber,
views
};
} catch (error) {
console.error('抓取淘票票数据时出错:', error);
return null;
} finally {
await browser.close();
}
}
抓取猫眼数据
async function scrapeMaoyan() {
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
...devices['iPhone 13'], // 使用 iPhone 13 的配置
locale: 'zh-CN',
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
});
const page = await context.newPage();
try {
await page.goto('https://i.maoyan.com/asgard/movie/1294273?channelId=4&cityId=1');
await page.waitForTimeout(3000)
// 评分
const scoreNumLocator = page.locator('.left-section .score');
// 参与评分人数
const scoreTextLocator = page.locator('.people-grade>span:first-child');
// 想看人数
const wantSeeNumberLocator = page.locator('.real-time-word-of-mouth .top .right .num').first().locator('span:first-child');
// 看过人数
const viewsLocator = page.locator('.real-time-word-of-mouth .top .right .watched>span').first();
const scoreNum = await scoreNumLocator.innerText();
const scoreText = await scoreTextLocator.innerText();
const wantSeeNumber = await wantSeeNumberLocator.innerText();
const views = await viewsLocator.innerText();
console.log(`猫眼数据 - 评分: ${scoreNum}, 参与评分人数: ${scoreText}, 想看人数: ${wantSeeNumber}, 看过人数: ${views}`);
return {
scoreNum,
scoreText,
wantSeeNumber,
views
};
} catch (error) {
console.error('抓取猫眼数据时出错:', error);
return null;
} finally {
await browser.close();
}
}
抓取微博数据
async function scrapeWeibo() {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
try {
// 此处使用微博搜索结果页作为数据来源,请替换为合适的 URL 和选择器
await page.goto('https://s.weibo.com/topic?q=%E5%93%AA%E5%90%92&pagetype=topic&topic=1&Refer=user_topic');
await page.waitForTimeout(3000)
// 热度指数
const scoreNumLocator = page.locator('.card-wrap .card').first().locator('.info p').last();
const scoreNum = await scoreNumLocator.innerText();
console.log(`微博数据 - 热度指数: ${scoreNum}`);
return { scoreNum };
} catch (error) {
console.error('抓取微博数据时出错:', error);
return null;
} finally {
await browser.close();
}
}
抓取抖音数据
async function scrapeDouyin() {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
try {
await page.goto('https://www.douyin.com/discover/search/%E5%93%AA%E5%90%922%E9%AD%94%E7%AB%A5%E9%97%B9%E6%B5%B7?aid=036a7592-d05a-4995-a86f-655dd7f45a05&type=general');
await page.waitForTimeout(3000)
// 热度指数
const scoreNumLocator = page.locator('.IcWw97gF>span:first-child');
const scoreNum = await scoreNumLocator.innerText();
console.log(`抖音数据 - 热度指数: ${scoreNum}`);
return { scoreNum };
} catch (error) {
console.error('抓取抖音数据时出错:', error);
return null;
} finally {
await browser.close();
}
}
数据抓取不难,难的是分析!
数据抓完了,我们怎么分析呢?这时候,deepseek 就派上用场了!我把所有平台的数据输入给它,让 deepseek 按照电影票房的预测模型进行分析。它不仅仅考虑了电影本身的热度,还会综合考虑节假日效应、市场竞争、社交媒体的传播效应等多方面的因素。
我们继续写代码来实现,接下来我们使用Promise.all
来获取所有数据,然后传递给predictBoxOffice
函数:
async function main() {
const [doubanData, taopiaopiaoData, maoyanData, weiboData, douyinData] = await Promise.all([
scrapeDouban(),
scrapeTaopiaopiao(),
scrapeMaoyan(),
scrapeWeibo(),
scrapeDouyin()
]);
// 检查是否有数据抓取失败
if (!doubanData || !taopiaopiaoData || !maoyanData || !weiboData || !douyinData) {
console.error('错误:部分数据抓取失败,无法进行预测。');
return;
}
const combinedData = {
douban: doubanData,
taopiaopiao: taopiaopiaoData,
maoyan: maoyanData,
weibo: weiboData,
douyin: douyinData,
};
const predictedBoxOffice = await predictBoxOffice(combinedData);
console.log(`预测的《哪吒2》最终票房金额为:\n${predictedBoxOffice}`);
}
// 执行主函数
main();
predictBoxOffice
函数就是重中之重了,用来最终预测哪吒2的票房,废话不多说,我们继续上代码
import OpenAI from "openai";
const openai = new OpenAI({
baseURL: 'https://api.deepseek.com',
apiKey: '<DeepSeek API Key>'
});
async function predictBoxOffice(data) {
// 整合各平台数据
const { douban, taopiaopiao, maoyan, weibo, douyin } = data;
const prompt = `你是一位资深的电影票房预测专家,同时精通数据分析和市场趋势研究。请基于最新实时票房数据(包括每日票房、观影人次、排片率等),结合以下多平台数据,对电影《哪吒2》的最终票房(单位:亿元)做出精准预测。
【数据指标说明】:
1. 豆瓣数据:
- 评分:${douban.rating}
- 评价人数:${douban.votes}
(高评分和大量投票通常预示着良好的口碑,但也需要关注口碑的分布情况)
2. 淘票票数据:
- 评分:${taopiaopiao.scoreNum}
- 参与评分人数:${taopiaopiao.scoreText}
- 想看人数:${taopiaopiao.wantSeeNumber}
- 看过人数:${taopiaopiao.views}
(预售票数反映了观众的购买意愿与市场信心)
3. 猫眼数据:
- 评分:${maoyan.scoreNum}
- 参与评分人数:${maoyan.scoreText}
- 想看人数:${maoyan.wantSeeNumber}
- 看过人数:${maoyan.views}
(“想看人数”可以衡量观众的期待值和区域市场热度)
4. 微博数据:
- 热度指数:${weibo.scoreNum}
(社交平台讨论热度能够反映影片在年轻群体中的影响力)
5. 抖音数据:
- 热度指数:${douyin.scoreNum}
(短视频平台的热度往往预示着影片的口碑传播和流行趋势)
【请重点分析以下因素】:
1. 影片定档于春节档,请评估节假日效应对票房的推动作用;
2. 请评估影片是否具备成为社会文化现象的潜力,并分析其对票房的额外拉动作用;
3. 请详细分析社交媒体(微博、抖音、B站)的热度变化趋势,尤其是上映后的爆发式传播效应;
4. 请参考中国电影市场的票房天花板(如《长津湖》57.75亿、《战狼2》56.94亿),评估《哪吒2》的票房潜力;
5. 请分析同期上映的其他影片表现,评估市场竞争格局对《哪吒2》票房的潜在影响;
6. 请基于多维度分析,给出票房预测区间(100亿元以上),并详细说明预测的不确定性因素。”
【请参考以下平台给出的最终票房预测】:
1. 猫眼专业版:超160亿元
`;
try {
const completion = await openai.chat.completions.create({
model: "deepseek-chat",
messages: [
{
role: 'system',
content: prompt,
},
{
role: 'user',
content: `请结合所有以上信息,给出电影《哪吒2魔童闹海》的最终票房预测,格式:最终预测票房:XX亿元`,
},
],
temperature: 0.3,
});
// 获取票房结果
const movieBoxOfficeData = completion.choices[0].message.content;
return movieBoxOfficeData;
} catch (error) {
console.error('调用模型进行预测时出错:', error);
return null;
}
}
然后呢?
然后就是最有趣的部分啦——根据这些数据,deepseek 给出了《哪吒2》的票房预测结果: 165亿元。
通过这种方式,我们就能比纯粹凭直觉猜测更加科学、合理地做出预测。而且,这个过程全程都是用代码自动化的,效率高到飞起!
不说了,我自己都觉得这个过程酷爆了,大家可以把代码复制到本地,运行起来试试看,看看你的预测结果把。