博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java豆瓣电影爬虫——抓取电影详情和电影短评数据
阅读量:6632 次
发布时间:2019-06-25

本文共 5514 字,大约阅读时间需要 18 分钟。

  一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析。正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来。现在做一个概要的介绍和演示。

 

动机

  采集豆瓣电影数据包括电影详情页数据和电影的短评数据。

  电影详情页如下图所示

  需要保存这些详情字段如导演、编剧、演员等还有图中右下方的标签。

 

  短评页面如下图所示

  需要保存的字段有短评所属的电影名称,每条评论的详细信息如评论人名称、评论内容等。

  

数据库设计

  有了如上的需求,需要设计表,其实很简单,只需要一张电影详情表movie和一张电影短评表comments,另外还需要一张存储网页提取的超链接的记录表record。

  movie表

  • movieId:主键,自增长
  • Name:电影名
  • Director:导演
  • Scenarist:编剧
  • Actors:主演
  • Type:类型
  • Country:制片国家/地区
  • Language:语言
  • releaseData: 上映日期
  • Runtime: 片长
  • ratingNum:豆瓣评分
  • Tags:标签

 

  comments表

  • commentId:主键,自增长
  • commentInfo:评论内容
  • commentAuthor:评论者
  • commentAuthorImgUrl:评论者头像链接
  • commentVote:评论点赞数
  • commentForMovie:评论的电影名
  • recordId:链接record表,暂时未用到

 

  record表

  • recordId:主键,自增长
  • URL:爬取解析的超链接
  • Crawled:是否被爬过

 

  注意:数据库设计是在不断调整的,比如之前设计了一张tags表,用于存储每部电影的标签,经过调整发现直接放到movie中作为一个字段更加方便,又比如comments表中,commentForMovie是后来加上的,方便查找当前的评论针对哪部电影。

 

使用的技术

  语言:Java(语言是一门工具,网上用python,java,nodejs比较多)

  数据库:Mysql(轻便易用)

  解析页面:Jsoup(比较熟悉httpparser,虽然功能强大,但是稍显繁琐,这里用Jsoup,因为其为类javascript语法)、正则表达式(对于一些结构比较奇怪的dom结构,采用了正则表达式的方式来提取信息,其实也可以用xpath,但是xpath极易受dom结构变化而失效)

  比如对于网页源码如下

    
肖申克的救赎 (豆瓣) .....
.........
导演: 弗兰克·德拉邦特
编剧: 弗兰克·德拉邦特 / 斯蒂芬·金
主演: 蒂姆·罗宾斯 / 摩根·弗里曼 / 鲍勃·冈顿 / 威廉姆·赛德勒 / 克兰西·布朗 / 吉尔·贝罗斯 / 马克·罗斯顿 / 詹姆斯·惠特摩 / 杰弗里·德曼 / 拉里·布兰登伯格 / 尼尔·吉恩托利 / 布赖恩·利比 / 大卫·普罗瓦尔 / 约瑟夫·劳格诺 / 祖德·塞克利拉
类型:
剧情 /
犯罪
制片国家/地区: 美国
语言: 英语
上映日期:
1994-09-10(多伦多电影节) /
1994-10-14(美国)
片长:
142 分钟
又名: 月黑高飞(港) / 刺激1995(台) / 地狱诺言 / 铁窗岁月 / 消香克的救赎
IMDb链接:
tt0111161
5星
81.5%
4星
16.2%
3星
2.1%
2星
0.1%
1星
0.1%
.........

 

  可以通过如下代码来解析相应字段(其中有用Jsoup和正则表达式的)

for (Element info : infos) {    if (info.childNodeSize() > 0) {        String key = info.getElementsByAttributeValue("class", "pl").text();        if ("导演".equals(key)) {            movie.setDirector(info.getElementsByAttributeValue("class", "attrs").text());        } else if ("编剧".equals(key)) {            movie.setScenarist(info.getElementsByAttributeValue("class", "attrs").text());        } else if ("主演".equals(key)) {            movie.setActors(info.getElementsByAttributeValue("class", "attrs").text());        } else if ("类型:".equals(key)) {            movie.setType(doc.getElementsByAttributeValue("property", "v:genre").text());        } else if ("制片国家/地区:".equals(key)) {            Pattern patternCountry = Pattern.compile(".制片国家/地区:.+[\\u4e00-\\u9fa5]+.+[\\u4e00-\\u9fa5]+\\s+
"); Matcher matcherCountry = patternCountry.matcher(doc.html()); if (matcherCountry.find()) { movie.setCountry(matcherCountry.group().split("")[1].split("
")[0].trim());// for example: >制片国家/地区: 中国大陆 / 香港
} } else if ("语言:".equals(key)) { Pattern patternLanguage = Pattern.compile(".语言:.+[\\u4e00-\\u9fa5]+.+[\\u4e00-\\u9fa5]+\\s+
"); Matcher matcherLanguage = patternLanguage.matcher(doc.html()); if (matcherLanguage.find()) { movie.setLanguage(matcherLanguage.group().split("")[1].split("
")[0].trim()); } } else if ("上映日期:".equals(key)) { movie.setReleaseDate(doc.getElementsByAttributeValue("property", "v:initialReleaseDate").text()); } else if ("片长:".equals(key)) { movie.setRuntime(doc.getElementsByAttributeValue("property", "v:runtime").text()); } }}movie.setTags(doc.getElementsByClass("tags-body").text());movie.setName(doc.getElementsByAttributeValue("property", "v:itemreviewed").text());movie.setRatingNum(doc.getElementsByAttributeValue("property", "v:average").text());

  

对于服务端返回不同状态的http status,本程序对于如304,401,403,404等都采取了丢弃处理,不作解析。

 

效果展示

 

  record表记录

 

  movie表记录

 

  comments表记录

 

  以上只是一个爬取数据的后台实现雏形,还有很多细节的问题需要解决。后期可能会补上环境搭建以及遇到的问题和解决方法相关的文章。

  

  

  程序爬取控制在豆瓣可接受范围内,不会给豆瓣服务器带来很大的压力,写此程序也是个人把玩,绝无恶意,万望豆瓣君谅解^_^

 

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

 

友情赞助

如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。

    1. 支付宝                                  2. 微信

                            

转载地址:http://eybvo.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
六种微服务架构的设计模式
查看>>
路由器配置大全
查看>>
备份单表数据
查看>>
Java豆瓣电影爬虫——抓取电影详情和电影短评数据
查看>>
ajax
查看>>
c语言插入排序
查看>>
052 自动将每日的日志增量导入到hive中
查看>>
Android NDK开发(五)--C代码回调Java代码【转】
查看>>
Linux systemd 打开调试终端、添加开机自运行程序
查看>>
教你一招:根据身份证号计算出生年月和年龄 text函数和mid函数混用 datedif函数和today函数混用...
查看>>
将用户信息保存到Cookie中
查看>>
struts 官方网址
查看>>
LCA近期公共祖先
查看>>
Quartz快速上手
查看>>
CentOS6.5安装Kibana5.3.0
查看>>
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
查看>>
EM算法求高斯混合模型參数预计——Python实现
查看>>
JS 得细心的坑位
查看>>
hdu1874 畅通project续(求最短路径)
查看>>