在这篇博客中,我们将深入探讨如何使用Node.js来爬取豆瓣网的电影数据。我们将从基本概念开始,逐步深入到高级技术,包括如何获取电影的详细信息和评论。
确保你的系统已经安装了Node.js和npm。如果没有,你可以从Node.js官网下载和安装。
在你选择的目录中创建一个新的Node.js项目,并安装必要的依赖:
npm init -y
npm install axios cheerio fs
我们将分步骤展示如何编写一个Node.js爬虫程序来爬取豆瓣电影数据。
首先,我们需要引入我们刚刚安装的依赖:
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
我们将编写一个函数来获取豆瓣电影的列表。这个函数将发送一个HTTP请求到豆瓣电影的网页,并解析返回的HTML来提取电影列表:
async function fetchMovieList(url) {
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
const movies = [];
$('.item').each((index, element) => {
const title = $(element).find('.title').text();
const rating = $(element).find('.rating_num').text();
const link = $(element).find('.hd a').attr('href');
movies.push({ title, rating, link });
});
return movies;
} catch (error) {
console.error('Error fetching movie list:', error);
}
}
接下来,我们将编写另一个函数来获取每部电影的详细信息。这个函数将接收一个电影的URL作为参数,然后发送一个HTTP请求来获取电影的详细信息:
async function fetchMovieDetails(url) {
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
const title = $('span[property="v:itemreviewed"]').text();
const director = $('a[rel="v:directedBy"]').text();
const genre = $('span[property="v:genre"]').map((i, el) => $(el).text()).get().join(', ');
const releaseDate = $('span[property="v:initialReleaseDate"]').text();
const runtime = $('span[property="v:runtime"]').text();
return { title, director, genre, releaseDate, runtime };
} catch (error) {
console.error('Error fetching movie details:', error);
}
}
我们还将编写一个函数来获取电影的评论。这个函数将接收一个电影的URL作为参数,然后发送一个HTTP请求来获取电影的评论:
async function fetchMovieComments(url) {
try {
const response = await axios.get(`${url}comments`);
const $ = cheerio.load(response.data);
const comments = [];
$('.comment').each((index, element) => {
const user = $(element).find('.comment-info a').text();
const rating = $(element).find('.comment-info span[class^="allstar"]').attr('title');
const commentText = $(element).find('.comment-content').text().trim();
comments.push({ user, rating, commentText });
});
return comments;
} catch (error) {
console.error('Error fetching movie comments:', error);
}
}
在我们保存数据到Markdown文件之前,我们需要清理文本以避免任何格式错误。我们将创建一个函数来完成这个任务:
function cleanText(text) {
return text.replace(/\r?\n|\r/g, ' ').replace(/\|/g, '-');
}
在主函数中,我们将调用上述函数,并将数据保存到Markdown文件中:
async function main() {
const url = 'https://movie.douban.com/top250';
const movieList = await fetchMovieList(url);
let markdownTable = '| 电影标题 | 评分 | 导演 | 类型 | 上映日期 | 时长 | 评论 |\n|---------|------|------|------|----------|------|------|\n';
for (let movie of movieList) {
const details = await fetchMovieDetails(movie.link);
const comments = await fetchMovieComments(movie.link);
const firstComment = comments.length > 0 ? cleanText(comments[0].commentText) : '无';
markdownTable += `| ${cleanText(movie.title)} | ${movie.rating} | ${cleanText(details.director)} | ${cleanText(details.genre)} | ${cleanText(details.releaseDate)} | ${cleanText(details.runtime)} | ${firstComment} |\n`;
}
fs.writeFile('movie.md', markdownTable, (err) => {
if (err) {
console.error('Error writing to file:', err);
} else {
console.log('Data saved to movie.md');
}
});
}
main();
在这一部分,我们将展示爬虫程序的运行效果。以下是一些效果截图:
电影标题 | 评分 | 导演 | 类型 | 上映日期 | 时长 | 评论 |
---|---|---|---|---|---|---|
肖申克的救赎 / The Shawshank Redemption | 9.7 | 弗兰克·德拉邦特 | 剧情, 犯罪 | 1994-09-10(多伦多电影节)1994-10-14(美国) | 142分钟 | 当年的奥斯卡颁奖礼上,被如日中天的《阿甘正传》掩盖了它的光彩,而随着时间的推移,这部电影在越来越多的人们心中的地位已超越了《阿甘》。每当现实令我疲惫得产生无力感,翻出这张碟,就重获力量。毫无疑问,本片位列男人必看的电影前三名!回顾那一段经典台词:“有的人的羽翼是如此光辉,即使世界上最黑暗的牢狱,也无法长久地将他围困!” |
霸王别姬 | 9.6 | 陈凯歌 | 剧情, 爱情, 同性 | 1993-07-26(中国大陆)1993-01-01(中国香港) | 171分钟 | 在野路子出身的张国荣面前,学院出身的张丰毅显得那么单薄 |
阿甘正传 / Forrest Gump | 9.5 | 罗伯特·泽米吉斯 | 剧情, 爱情 | 1994-06-23(洛杉矶首映)1994-07-06(美国) | 142分钟 | 羡慕珍妮,不管她多么叛逆、落魄、堕落,永远有阿甘在等她回来 |
泰坦尼克号 / Titanic | 9.5 | 詹姆斯·卡梅隆 | 剧情, 爱情, 灾难 | 1998-04-03(中国大陆)2023-04-03(中国大陆重映)1997-11-01(东京电影节)1997-12-19(美国) | 194分钟 | “我甚至连一张他的画像都没有,但他永远活在我心中。” 要敢说,这是我一直深爱的电影。 3D效果言过其实;被删裸戏无察觉;IMAX看清冰山全貌;Rose美的神魂颠倒,Jack帅的令人窒息;甲板上Jack对Rose说:I see you. 看过不下10遍,能记住每个情节、台词、人物及配乐,该哭地方还是会哭;3碟正版VCD能记住两次换碟的准确时刻;初二看完后自己经常在水盆里用水瓢演习沉船全过程… |
这个杀手不太冷 / Léon | 9.4 | 吕克·贝松 | 剧情, 动作, 犯罪 | 1994-09-14(法国) | 110分钟(剧场版) | 我开始想要过得快乐,睡在床上,有牵挂 |
千与千寻 / 千と千尋の神隠し | 9.4 | 宫崎骏 | 剧情, 动画, 奇幻 | 2019-06-21(中国大陆)2001-07-20(日本) | 125分钟 | 每次看这些神作的时候想到这是动画片这是一群牛人一笔一笔画出来的,就觉得漏看掉一帧都实在是对不起他们啊 |
美丽人生 / La vita è bella | 9.6 | 罗伯托·贝尼尼 | 剧情, 喜剧, 爱情, 战争 | 2020-01-03(中国大陆)1997-12-20(意大利) | 116分钟(国际版) | 我以为如此智慧的一个人,在那几声枪响过后,必定是会走出来,继续对他的公主说早安的… |
星际穿越 / Interstellar | 9.4 | 克里斯托弗·诺兰 | 剧情, 科幻, 冒险 | 2014-11-12(中国大陆)2020-08-02(中国大陆重映)2014-11-07(美国) | 169分钟 | 时间可以伸缩和折叠,唯独不能倒退。你的鹤发或许是我的童颜,而我一次呼吸能抵过你此生的岁月。 |
辛德勒的名单 / Schindler’s List | 9.6 | 史蒂文·斯皮尔伯格 | 剧情, 历史, 战争 | 1993-11-30(华盛顿首映)1994-02-04(美国) | 195分钟 | 有钱才能保护喜欢的人 |
盗梦空间 / Inception | 9.4 | 克里斯托弗·诺兰 | 剧情, 科幻, 悬疑, 冒险 | 2010-09-01(中国大陆)2020-08-28(中国大陆重映)2010-07-16(美国) | 148分钟 | 1、电影确实精彩。2、没有想象的难懂,相信你自己。3、总会有一个让你记一辈子的镜头。4、请降低期待值。5、请提前上厕所。6、记得关手机。7、一定要去影院,因为影院也是个造梦机器。8、记得听完结尾音乐。因为它负责让你醒来。9、极可能是近几年你在影院看过最精彩的电影。10、穿越吧少年 |
楚门的世界 / The Truman Show | 9.4 | 彼得·威尔 | 剧情, 科幻 | 1998-06-05(美国) | 103分钟 | 我是不是也在楚门的世界活着? |
忠犬八公的故事 / Hachi: A Dog’s Tale | 9.4 | 拉斯·霍尔斯道姆 | 剧情 | 2009-06-13(西雅图电影节)2010-03-12(英国) | 93分钟 | 感动你们的是电影,还是故事本身? |
海上钢琴师 / La leggenda del pianista sull’oceano | 9.3 | 朱塞佩·托纳多雷 | 剧情, 音乐 | 2019-11-15(中国大陆)1998-10-28(意大利) | 165分钟 | 某一天我突然明白,他不能离开的不是那艘船,而是那片养育他的精神家园 |
三傻大闹宝莱坞 / 3 Idiots | 9.2 | 拉吉库马尔·希拉尼 | 剧情, 喜剧, 爱情, 歌舞 | 2011-12-08(中国大陆)2009-12-25(印度) | 171分钟(印度) | 看了这部电影是我2010年最幸运的一件事 力荐! |
放牛班的春天 / Les choristes | 9.3 | 克里斯托夫·巴哈蒂 | 剧情, 音乐 | 2004-10-16(中国大陆)2022-12-02(中国大陆重映)2004-03-17(法国) | 97分钟 | 纸飞机+挥动的小手——那一刻,什么都值了 |
机器人总动员 / WALL·E | 9.3 | 安德鲁·斯坦顿 | 科幻, 动画, 冒险 | 2008-06-27(美国) | 98分钟 | 这是一只安卓和苹果的故事么。。 |
疯狂动物城 / Zootopia | 9.2 | 拜伦·霍华德瑞奇·摩尔杰拉德·布什 | 喜剧, 动画, 冒险 | 2016-03-04(中国大陆/美国)2020-07-24(中国大陆重映) | 109分钟(中国大陆) | 树懒太他妈好笑了!!那两分钟我嗓子都哑了!!卧槽!!真是太他妈好笑了!! |
无间道 / 無間道 | 9.3 | 刘伟强麦兆辉 | 剧情, 惊悚, 犯罪 | 2003-09-05(中国大陆)2002-12-12(中国香港) | 101分钟 | 牛就牛在,他让所有演员都达到了巅峰 |
控方证人 / Witness for the Prosecution | 9.6 | 比利·怀尔德 | 剧情, 悬疑, 犯罪 | 1957-12-17(美国) | 116分钟 | 当结尾旁白说“影院友情提示,为了保证您没有看过这部电影的朋友,有机会获得更大观影乐趣,请您不要像任何人透露这部电影的结局”时,真爽,这个电影真是骗足了同情心,飚足了演技,压足了节奏,然后唰唰大释放。一场英国男人和德国女人之间爱情与欺骗的故事,现在才看,对不起比利·怀尔德老人家。 |
大话西游之大圣娶亲 / 西遊記大結局之仙履奇緣 | 9.2 | 刘镇伟 | 喜剧, 爱情, 奇幻, 古装 | 2014-10-24(中国大陆)2017-04-13(中国大陆重映)1995-02-04(中国香港) | 95分钟 | 一遍烂,两遍笑,三遍哭 |
熔炉 / 도가니 | 9.4 | 黄东赫 | 剧情 | 2011-09-22(韩国) | 125分钟 | 他们至少有电影的力量在支撑着弱势群体,而我们呢?因为【熔炉】的上映,一部关于【性暴力犯罪处罚特别法部分修订法律案】目前已通过韩国国会正式颁布,当时的嫌疑人也已被警方逮捕,【熔炉】让我们看到一部现实题材影片所蕴含的巨大能量。有时候一部电影真的可以改变一个世界! |
教父 / The Godfather | 9.3 | 弗朗西斯·福特·科波拉 | 剧情, 犯罪 | 1972-03-15(纽约首映)1972-03-24(美国) | 175 分钟 | “Because a man who doesn’t spend time with his family can never be a real man.” |
触不可及 / Intouchables | 9.3 | 奥利维埃·纳卡什埃里克·托莱达诺 | 剧情, 喜剧 | 2011-11-02(法国) | 112分钟 | 音乐真棒,看到最后有些意犹未尽。很舒服的电影,故事有趣又会带些感动。两个完全不同世界的人,因为教育、知识、习惯等各种不同造成情节冲突及笑料;而彼此的影响和同化则是感动的部分。对于菲利普来说,有时需要的未必是小心翼翼的服侍,而是像对待普通人一样的无歧视对待。 |
当幸福来敲门 / The Pursuit of Happyness | 9.2 | 加布里埃莱·穆奇诺 | 剧情, 家庭, 传记 | 2008-01-17(中国大陆)2020-07-20(中国大陆重映)2006-12-15(美国) | 117分钟 | 看到开头就知道结局,不过这并不重要,重要的是过程。。。最感人的不是赢得职位,而是在厕所里捂住儿子的耳朵。。。作为一名容易感情用事的中国观众,感动比励志对我来说更重要=。= |
末代皇帝 / The Last Emperor | 9.3 | 贝纳尔多·贝托鲁奇 | 剧情, 传记, 历史 | 1987-10-04(东京国际电影节)1987-10-23(意大利) | 163分钟 | 难得用经典这个字 |
通过这篇博客,你应该已经学会了如何使用Node.js来爬取和解析豆瓣电影的数据,包括电影的详细信息和评论。你可以尝试扩展这个程序,以获取更多的数据或添加更多的功能。
希望你找到这篇博客有用!如果你有任何问题或需要进一步的帮助,请随时联系。
注意:爬虫程序应遵守目标网站的robots.txt文件和相关法律法规,不要过于频繁地请求网站,以免给网站服务器造成负担。