电影评论网络数据抓取与分析系统设计与实现

一、论题的研究背景、目的和意义
电影,在当今社会,作为人们在日常生活中重要的娱乐方式,已经发展出多种多样的形式,供人们体验电影所带来的乐趣。但是,人们在看完电影之后,往往会生出许多的感慨,或许是同情主人公的遭遇,或许是对于故事的情节十分感动,或许是对电影特效精彩的赞叹,总之,人们在看完一部电影后或多或少都会将自己的感触告诉他人,或者是想了解他人是否同自己一样对于相同的影片有同样的感受,因此,为了让更多的人可以方便地通过互联网相互之间交流对于电影的感想或是发布一些影评,或者可以从他人的影评中了解这部电影是否值得去看,于是,建立一个对于影评的搜索系统就显得很有必要了。
基于网络爬虫的搜索引擎研究与实现,在当今网络中已非常普及。目前比较流行的搜索引擎代表有谷歌,百度,搜狗等。合理地使用好算法抓取页面,才是网络爬虫实现的核心。
爬虫又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动的抓取互联网中网页或者脚本,而影评搜索需要特定的收集,使得数据更加具有目的性。传统的爬虫是从一个或者多个初始url开始,不断的从当前页面抽取新的url进行搜索,直到满足一定条件才会停止。而聚集爬虫是根据一定的网页分析算法过滤于主体无关的链接,并将其放入等待抓取的url队列中,然后进行一定的分析,过滤,并建立索引,以便之后的查询和检索。网页的抓取策略可以分为深度优先,广度优先和最近优先三种。
二、综述国内外对本论题的研究动态(附主要参考文献)
关于网络爬虫的研究与设计从上世纪九十年代就开始了,到目前为止爬虫技术已经趋见成熟,网络爬虫是搜索引擎的重要组成部分。网络上比较著名的开源爬虫包括Nutch,Larbin,Heritrix。网络爬虫最重要的是网页搜索策略(广度优先和最佳度优先)和网页分析策略(基于网络拓扑的分析算法和基于网页内容的网页分析算法)。
国内外流行的爬虫技术相当多,很多人喜欢基于Python的,也有人喜欢用C#,很多人由于系统集成开发和跨平台的需要倾向于java,因为我对Java比较了解,所以我比较喜欢用Java语言去开发。
就原理来说,爬虫组件都是差不多的,无头浏览器,最能够说明爬虫的特性,它们被设计创造出来,大部分情况是用于自动化测试的。
基于socket的httpclient功能简单,性能强大,特别是在高并发的情况下,而被大家所青睐,特别是搜索引擎中,如果抓取静态页面,httpclient非常适合。基于socket的httpclient功能简单,性能强大,特别是在高并发的情况下,而被大家所青睐,特别是搜索引擎中,如果抓取静态页面,httpclient非常适合。
当遇到ajax加载的信息,就需要javascript效果渲染的时候,httpclient就不行了,htmlunit是基于httpclient加入Rhino引擎实现js渲染的无头浏览器,当然包含了httpclient的特性,然而,由于内存泄露的问题,高并发的状态下,并不能很稳定的工作,内存消耗随着程序的运行而不断增大,直到达到jvm分配的上限而崩溃。很多时候,你只能做个权衡,每个webclient使用若干次后就把它回收,然后重新启动一个,这非常影响性能。Rhino对于javascript的支持并不好,实际使用中,会发现各种Exception,很多时候会导致无法渲染出想要的结果,这个htmlunit的又一大缺陷。随着版本的更新,能够渐次解决一些问题,但是好的程序员,还是应该自己读源码来尝试解决问题。
Phantomjs相比于htmlunit,对于js的支持更接近真实的浏览器,但是并发性能差,通过java的exec调用系统命令来启动,更加降低了性能。
此外主流的浏览器都提供了相应的抓取支持,selenium可谓是一个集大成者,包含了上述的所有组件,以WebDriver的形式,适配各种爬虫组件,你可以用它操控浏览器自动抓取,当然,并发和性能的问题依然存在。
爬虫开发的主要问题是性能和反封锁。很多时候,采用高并发高频率抓取数据是可行的,前提是目标站点没有采用任何反爬措施(访问频率限制、防火墙、验证码……);更多时候,有价值的信息,一定伴随着严格的反爬措施,一旦ip被封,什么组件都没戏了。你不得不维护一个代理IP池来解决这个问题,当然,这也带来了代理ip稳定性和速度的问题,这些问题都是无法回避的问题,我们需要针对具体的情况,采用对应的措施,以最大限度的完成爬虫爬取任务。
目前,爬虫的需求呈爆炸式增长的趋势,这是当前各种互联网创新和大数据时代的新常态。火车和八爪鱼等团队看到了这一点,并率先开发了相对完备的爬虫产品,很多用户都在使用,但是更多的用户希望直接把爬虫抓取任务外包出去,因为他们不懂技术,工具的使用需要逾越技术的鸿沟,大部分用户并没有这个逾越鸿沟的打算。我相信技术会越来越发达,爬虫需求者和爬虫开发者将会有更加通畅的交流渠道。
[1]于娟,刘强.主题网络爬虫研究综述[J].计算机工程与科学. 2015(02)
[2]赵茉莉. 网络爬虫系统的研究与实现[D].电子科技大学;2013年
[3]曾伟辉. 支持AJAX的网络爬虫系统设计与实现[D].中国科学技术大学,2009. 
[4]龚勇. 搜索引擎中网络爬虫的研究[D].武汉理工大学,2010.
[5]姜梦稚. 基于Java的多线程网络爬虫设计与实现[J]. 微型电脑应用,2010.
[6]江沛. 基于网络爬虫的电影集成搜索系统设计与实现[D].江西农业大学,2014.
[7]张亮. 基于HTMLParser和HttpClient的网络爬虫原理与实现[J]. 电脑编程技巧与维护,2011
[8]史宝明,贺元香,吴崇正. 主题搜索引擎中爬虫搜索策略的研究[J]. 计算机工程与应用,2014.
[9] 韩万江.软件工程案例教程[M].北京:机械工业出版社,2009
[10] 刘志铭,高春艳等.Visual Basic数据库开发实例解析[M].机械工业出版社,2003年8月 .   
[11]么士宇. 基于分布式计算的网络爬虫技术研究[D].大连海事大学,2011.
[12]周立柱,林玲. 聚焦爬虫技术研究综述[J]. 计算机应用,2005
[13]徐远超,刘江华,刘丽珍,关永. 基于Web的网络爬虫的设计与实现[J]. 微计算机信息,2007
[14]周德懋,李舟军. 高性能网络爬虫:研究综述[J]. 计算机科学,2009
[15]罗刚,王振东.自己动手写网络爬虫[M].北京:清华大学出版社,2010
三、研究的基本内容,拟解决的主要问题
本课题研究的内容是如何使网络爬虫实现一个相对简单高效的搜索引擎。了解网络爬虫的基本工作机制,解决如何实现快速有效的获取影评。

1.如何根据网站主体特性不同构造URL。
2.如何具备更强的抓取能力。
3.如何分辨重复的网页内容。
4.如何确定主题相关性。
5.对于对线程并发的处理。
6.对于缓存和并发请求的处理
7.对反扒机制的应对
8.对于网络时延等的处理。
9.对于数据的存储格式与形式

 

四、研究的研究方法、研究条件和可能存在的问题
1.方法
利用网络查阅国内相关资料,利用数据库浏览大量的期刊与文献,进行分析与研究。深入国内网络爬虫系统开发社区,与开发者交流,并与自身实习岗位所做的爬虫系统的一线开发人员进行交流,获取更多信息技术。本系统采用java实现,模块化结构,独立开发各个功能模块,降低模块之间的耦合,在各个功能模块实现的基础上构建灵活的界面。
首先进行需求分析,依据分析结果建立相关的逻辑联系,确定系统的基本功能,然后完成相关功能的源代码编写,初步完成系统的制作,随后进行细节的修改,依次完成系统功能,最后进行系统的调试,检查系统存在的错误,并修改,经过反复的测试修改,最终完成系统初期的愿望,并完成文档的编写后将论文装订成册。
2. 研究条件
1)文献查阅条件:学校图书馆、校园网和互联网提供了海量文献、资料可供查阅。
2)设备条件:学院大部分专业实验室对学生开放,可随时使用计算机及相关设备。
3. 可能存在的问题
  可能采集到的影评数量较少于实际url里面的影评数量。

 

电影评论网络数据抓取与分析系统设计与实现登录注册界面

电影评论网络数据抓取与分析系统设计与实现mysql数据库版本源码:

超级管理员表创建语句如下:


create table t_admin(
	id int primary key auto_increment comment '主键',
	username varchar(100) comment '超级管理员账号',
	password varchar(100) comment '超级管理员密码'
) comment '超级管理员';
insert into t_admin(username,password) values('admin','123456');

表创建语句如下:


create table t_movice(
	id int primary key auto_increment comment '主键',
	title varchar(100) comment '',
	url varchar(100) comment '',
	pic varchar(100) comment ''
) comment '';

表创建语句如下:


create table t_pinglun(
	id int primary key auto_increment comment '主键',
	moviceId int comment '',
	content varchar(100) comment ''
) comment '';

电影评论网络数据抓取与分析系统设计与实现oracle数据库版本源码:

超级管理员表创建语句如下:


create table t_admin(
	id integer,
	username varchar(100),
	password varchar(100)
);
insert into t_admin(id,username,password) values(1,'admin','123456');
--超级管理员字段加注释
comment on column t_admin.id is '主键';
comment on column t_admin.username is '超级管理员账号';
comment on column t_admin.password is '超级管理员密码';
--超级管理员表加注释
comment on table t_admin is '超级管理员';

表创建语句如下:


create table t_movice(
	id integer,
	title varchar(100),
	url varchar(100),
	pic varchar(100)
);
--字段加注释
comment on column t_movice.id is '主键';
comment on column t_movice.title is '';
comment on column t_movice.url is '';
comment on column t_movice.pic is '';
--表加注释
comment on table t_movice is '';

表创建语句如下:


create table t_pinglun(
	id integer,
	moviceId int,
	content varchar(100)
);
--字段加注释
comment on column t_pinglun.id is '主键';
comment on column t_pinglun.moviceId is '';
comment on column t_pinglun.content is '';
--表加注释
comment on table t_pinglun is '';

oracle特有,对应序列如下:


create sequence s_t_movice;
create sequence s_t_pinglun;

电影评论网络数据抓取与分析系统设计与实现sqlserver数据库版本源码:

超级管理员表创建语句如下:


--超级管理员
create table t_admin(
	id int identity(1,1) primary key not null,--主键
	username varchar(100),--超级管理员账号
	password varchar(100)--超级管理员密码
);
insert into t_admin(username,password) values('admin','123456');

表创建语句如下:


--表注释
create table t_movice(
	id int identity(1,1) primary key not null,--主键
	title varchar(100),--
	url varchar(100),--
	pic varchar(100)--
);

表创建语句如下:


--表注释
create table t_pinglun(
	id int identity(1,1) primary key not null,--主键
	moviceId int,--
	content varchar(100)--
);

电影评论网络数据抓取与分析系统设计与实现登录后主页

电影评论网络数据抓取与分析系统设计与实现spring+springMVC+hibernate框架对象(javaBean,pojo)设计:

javaBean创建语句如下:


package project.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Entity

//
@Table(name = "t_movice")
public class Movice {
//主键
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
//
private String title;
//
private String url;
//
private String pic;
public String getTitle() {return title;}
public void setTitle(String title) {this.title = title;}
public String getUrl() {return url;}
public void setUrl(String url) {this.url = url;}
public String getPic() {return pic;}
public void setPic(String pic) {this.pic = pic;}
}

javaBean创建语句如下:


package project.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Entity

//
@Table(name = "t_pinglun")
public class Pinglun {
//主键
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
//
private Integer moviceId;
//
private String content;
public Integer getMoviceId() {return moviceId;}
public void setMoviceId(Integer moviceId) {this.moviceId = moviceId;}
public String getContent() {return content;}
public void setContent(String content) {this.content = content;}
}

电影评论网络数据抓取与分析系统设计与实现spring+springMVC+mybatis框架对象(javaBean,pojo)设计:

javaBean创建语句如下:


package project.model;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

//
public class Movice  extends BaseBean{
//主键
private Integer id;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
//
private String title;
//
private String url;
//
private String pic;
public String getTitle() {return title;}
public void setTitle(String title) {this.title = title;}
public String getUrl() {return url;}
public void setUrl(String url) {this.url = url;}
public String getPic() {return pic;}
public void setPic(String pic) {this.pic = pic;}
}

javaBean创建语句如下:


package project.model;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

//
public class Pinglun  extends BaseBean{
//主键
private Integer id;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
//
private Integer moviceId;
//
private String content;
public Integer getMoviceId() {return moviceId;}
public void setMoviceId(Integer moviceId) {this.moviceId = moviceId;}
public String getContent() {return content;}
public void setContent(String content) {this.content = content;}
}

源代码下载点这里

评论