使用Node.js爬取豆瓣电影数据:全面指南(附代码示例和效果展示)

使用Node.js爬取豆瓣电影数据:全面指南(附代码示例和效果展示)

介绍

在这篇博客中,我们将深入探讨如何使用Node.js来爬取豆瓣网的电影数据。我们将从基本概念开始,逐步深入到高级技术,包括如何获取电影的详细信息和评论。

准备工作

环境准备

确保你的系统已经安装了Node.js和npm。如果没有,你可以从Node.js官网下载和安装。

项目初始化

在你选择的目录中创建一个新的Node.js项目,并安装必要的依赖:

npm init -y
npm install axios cheerio fs

编写爬虫程序

我们将分步骤展示如何编写一个Node.js爬虫程序来爬取豆瓣电影数据。

步骤1:引入依赖

首先,我们需要引入我们刚刚安装的依赖:

const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');

步骤2:获取电影列表

我们将编写一个函数来获取豆瓣电影的列表。这个函数将发送一个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);
  }
}

步骤3:获取电影详细信息

接下来,我们将编写另一个函数来获取每部电影的详细信息。这个函数将接收一个电影的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);
  }
}

步骤4:获取电影评论

我们还将编写一个函数来获取电影的评论。这个函数将接收一个电影的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);
  }
}

步骤5:清理文本

在我们保存数据到Markdown文件之前,我们需要清理文本以避免任何格式错误。我们将创建一个函数来完成这个任务:

function cleanText(text) {
  return text.replace(/\r?\n|\r/g, ' ').replace(/\|/g, '-');
}

步骤6:主函数

在主函数中,我们将调用上述函数,并将数据保存到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 Redemption9.7弗兰克·德拉邦特剧情, 犯罪1994-09-10(多伦多电影节)1994-10-14(美国)142分钟当年的奥斯卡颁奖礼上,被如日中天的《阿甘正传》掩盖了它的光彩,而随着时间的推移,这部电影在越来越多的人们心中的地位已超越了《阿甘》。每当现实令我疲惫得产生无力感,翻出这张碟,就重获力量。毫无疑问,本片位列男人必看的电影前三名!回顾那一段经典台词:“有的人的羽翼是如此光辉,即使世界上最黑暗的牢狱,也无法长久地将他围困!”
霸王别姬9.6陈凯歌剧情, 爱情, 同性1993-07-26(中国大陆)1993-01-01(中国香港)171分钟在野路子出身的张国荣面前,学院出身的张丰毅显得那么单薄
阿甘正传 / Forrest Gump9.5罗伯特·泽米吉斯剧情, 爱情1994-06-23(洛杉矶首映)1994-07-06(美国)142分钟羡慕珍妮,不管她多么叛逆、落魄、堕落,永远有阿甘在等她回来
泰坦尼克号 / Titanic9.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éon9.4吕克·贝松剧情, 动作, 犯罪1994-09-14(法国)110分钟(剧场版)我开始想要过得快乐,睡在床上,有牵挂
千与千寻 / 千と千尋の神隠し9.4宫崎骏剧情, 动画, 奇幻2019-06-21(中国大陆)2001-07-20(日本)125分钟每次看这些神作的时候想到这是动画片这是一群牛人一笔一笔画出来的,就觉得漏看掉一帧都实在是对不起他们啊
美丽人生 / La vita è bella9.6罗伯托·贝尼尼剧情, 喜剧, 爱情, 战争2020-01-03(中国大陆)1997-12-20(意大利)116分钟(国际版)我以为如此智慧的一个人,在那几声枪响过后,必定是会走出来,继续对他的公主说早安的…
星际穿越 / Interstellar9.4克里斯托弗·诺兰剧情, 科幻, 冒险2014-11-12(中国大陆)2020-08-02(中国大陆重映)2014-11-07(美国)169分钟时间可以伸缩和折叠,唯独不能倒退。你的鹤发或许是我的童颜,而我一次呼吸能抵过你此生的岁月。
辛德勒的名单 / Schindler’s List9.6史蒂文·斯皮尔伯格剧情, 历史, 战争1993-11-30(华盛顿首映)1994-02-04(美国)195分钟有钱才能保护喜欢的人
盗梦空间 / Inception9.4克里斯托弗·诺兰剧情, 科幻, 悬疑, 冒险2010-09-01(中国大陆)2020-08-28(中国大陆重映)2010-07-16(美国)148分钟1、电影确实精彩。2、没有想象的难懂,相信你自己。3、总会有一个让你记一辈子的镜头。4、请降低期待值。5、请提前上厕所。6、记得关手机。7、一定要去影院,因为影院也是个造梦机器。8、记得听完结尾音乐。因为它负责让你醒来。9、极可能是近几年你在影院看过最精彩的电影。10、穿越吧少年
楚门的世界 / The Truman Show9.4彼得·威尔剧情, 科幻1998-06-05(美国)103分钟我是不是也在楚门的世界活着?
忠犬八公的故事 / Hachi: A Dog’s Tale9.4拉斯·霍尔斯道姆剧情2009-06-13(西雅图电影节)2010-03-12(英国)93分钟感动你们的是电影,还是故事本身?
海上钢琴师 / La leggenda del pianista sull’oceano9.3朱塞佩·托纳多雷剧情, 音乐2019-11-15(中国大陆)1998-10-28(意大利)165分钟某一天我突然明白,他不能离开的不是那艘船,而是那片养育他的精神家园
三傻大闹宝莱坞 / 3 Idiots9.2拉吉库马尔·希拉尼剧情, 喜剧, 爱情, 歌舞2011-12-08(中国大陆)2009-12-25(印度)171分钟(印度)看了这部电影是我2010年最幸运的一件事 力荐!
放牛班的春天 / Les choristes9.3克里斯托夫·巴哈蒂剧情, 音乐2004-10-16(中国大陆)2022-12-02(中国大陆重映)2004-03-17(法国)97分钟纸飞机+挥动的小手——那一刻,什么都值了
机器人总动员 / WALL·E9.3安德鲁·斯坦顿科幻, 动画, 冒险2008-06-27(美国)98分钟这是一只安卓和苹果的故事么。。
疯狂动物城 / Zootopia9.2拜伦·霍华德瑞奇·摩尔杰拉德·布什喜剧, 动画, 冒险2016-03-04(中国大陆/美国)2020-07-24(中国大陆重映)109分钟(中国大陆)树懒太他妈好笑了!!那两分钟我嗓子都哑了!!卧槽!!真是太他妈好笑了!!
无间道 / 無間道9.3刘伟强麦兆辉剧情, 惊悚, 犯罪2003-09-05(中国大陆)2002-12-12(中国香港)101分钟牛就牛在,他让所有演员都达到了巅峰
控方证人 / Witness for the Prosecution9.6比利·怀尔德剧情, 悬疑, 犯罪1957-12-17(美国)116分钟当结尾旁白说“影院友情提示,为了保证您没有看过这部电影的朋友,有机会获得更大观影乐趣,请您不要像任何人透露这部电影的结局”时,真爽,这个电影真是骗足了同情心,飚足了演技,压足了节奏,然后唰唰大释放。一场英国男人和德国女人之间爱情与欺骗的故事,现在才看,对不起比利·怀尔德老人家。
大话西游之大圣娶亲 / 西遊記大結局之仙履奇緣9.2刘镇伟喜剧, 爱情, 奇幻, 古装2014-10-24(中国大陆)2017-04-13(中国大陆重映)1995-02-04(中国香港)95分钟一遍烂,两遍笑,三遍哭
熔炉 / 도가니9.4黄东赫剧情2011-09-22(韩国)125分钟他们至少有电影的力量在支撑着弱势群体,而我们呢?因为【熔炉】的上映,一部关于【性暴力犯罪处罚特别法部分修订法律案】目前已通过韩国国会正式颁布,当时的嫌疑人也已被警方逮捕,【熔炉】让我们看到一部现实题材影片所蕴含的巨大能量。有时候一部电影真的可以改变一个世界!
教父 / The Godfather9.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.”
触不可及 / Intouchables9.3奥利维埃·纳卡什埃里克·托莱达诺剧情, 喜剧2011-11-02(法国)112分钟音乐真棒,看到最后有些意犹未尽。很舒服的电影,故事有趣又会带些感动。两个完全不同世界的人,因为教育、知识、习惯等各种不同造成情节冲突及笑料;而彼此的影响和同化则是感动的部分。对于菲利普来说,有时需要的未必是小心翼翼的服侍,而是像对待普通人一样的无歧视对待。
当幸福来敲门 / The Pursuit of Happyness9.2加布里埃莱·穆奇诺剧情, 家庭, 传记2008-01-17(中国大陆)2020-07-20(中国大陆重映)2006-12-15(美国)117分钟看到开头就知道结局,不过这并不重要,重要的是过程。。。最感人的不是赢得职位,而是在厕所里捂住儿子的耳朵。。。作为一名容易感情用事的中国观众,感动比励志对我来说更重要=。=
末代皇帝 / The Last Emperor9.3贝纳尔多·贝托鲁奇剧情, 传记, 历史1987-10-04(东京国际电影节)1987-10-23(意大利)163分钟难得用经典这个字

通过这篇博客,你应该已经学会了如何使用Node.js来爬取和解析豆瓣电影的数据,包括电影的详细信息和评论。你可以尝试扩展这个程序,以获取更多的数据或添加更多的功能。

希望你找到这篇博客有用!如果你有任何问题或需要进一步的帮助,请随时联系。


注意:爬虫程序应遵守目标网站的robots.txt文件和相关法律法规,不要过于频繁地请求网站,以免给网站服务器造成负担。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evan_422

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值