网络空间安全概论 实验7网络爬虫 基于豆瓣长影评的内容推_第1页
网络空间安全概论 实验7网络爬虫 基于豆瓣长影评的内容推_第2页
网络空间安全概论 实验7网络爬虫 基于豆瓣长影评的内容推_第3页
网络空间安全概论 实验7网络爬虫 基于豆瓣长影评的内容推_第4页
网络空间安全概论 实验7网络爬虫 基于豆瓣长影评的内容推_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中国矿业大学计算机学院2018级本科生课程报告课程名称信息内容安全报告题目基于豆瓣长影评的内容推荐报告时间2021.7.6姓名周宗文学号08182901任课教师曹天杰2020-2021(二)《信息内容安全》课程报告评分表序号毕业要求课程教学目标考查方式与考查点占比得分12.3目标1:掌握信息内容安全的基本概念、分类、原理和相关技术,能够根据课程基本知识对信息内容安全领域出现的问题进行归类、分析、并有初步分析和解决问题的能力。通过课堂讲授和课堂研讨掌握信息内容安全概念和理论知识。40%3.2目标2:掌握信息内容安全处理相关的理论、技术以及健全的评价体系,能够根据具体问题分析算法、设计算法、实现算法并能综合评价算法。24.3目标3:掌握信息内容安全的基础知识,针对具体问题和要求选择正确的技术路线,通过在实验环境中进行仿真实验并能根据算法特点进行攻击测试和综合性能评价,得到具有参考价值的结论。课程报告;实现有关信息内容安全的一个软件系统。分析和对比各项技术,选择相应的技术进行算法设计并在实验环境中进行仿真实验和性能评价,得到有效结论。60%总分100%评阅人:2021年7月10日目录报告摘要 4报告正文 51.程序流程 52.爬虫部分 62.1分析和爬取豆瓣电影长评页面 62.2爬取豆瓣详细评论 72.3应对反爬虫措施 82.4爬虫部分代码 83.推荐部分 103.1.文章结构化 103.2计算相似度矩阵 123.3用户矩阵 123.4计算推荐度 134.实现效果 13报告摘要关键词:豆瓣长影评;爬虫;影评推荐;基于内容的推荐;根据在课堂上所学的内容,观察豆瓣长影评论页面的特征,编写了一个爬虫实现可以自动爬取豆瓣某一电影下的所有长影评,实现对这些评论的分析,根据TD-IDF算法提取关键词作为特征向量,计算各文章的相似度,最终实现对用户推荐用户没有看过的,推荐度高的文章。

报告正文程序流程根据课堂上所学的知识,以及我的理解,我设计的程序流程是这样的图1程序流程图以上就是我设计的程序流程。接下来就解析各部分的实现过程,这里简化了程序,这个程序只爬取5篇评论,提取前10个关键词进行相似度矩阵的计算,然后随机生成5个用户的用户矩阵进行推荐度计算,然后根据计算出来的推荐值的大小,给用户进行推荐。2.爬虫部分2.1分析和爬取豆瓣电影长评页面首先构造url,观察豆瓣的长影评基本都是/subject/+电影id+/reviews?start=,start值为评论页数,这种格式,构造url把电影页面的html文件爬取下来,分析我们要爬取的内容所在的元素。图2豆瓣电影页面例如这个页面,它是不显示这篇文章的详细内容的,只有一个展开,我们爬下它的html页面进行分析图3需要爬取的标签对于在这个页面的评论,我只爬取每个评论下的<ahref="/people/204500361/"class="name">夏风已至</a><h2><ahref="/review/13611559/">后半段高潮迭起</a></h2><spanclass="allstar40main-title-rating"title="推荐"></span>这几个标签,代表评价的用户名,文章具体链接,以及对这个电影的评价,这里评价会在之后作为文章的特征向量,文章具体链接用于再次构造请求爬取具体整篇文章。这里有一个特殊的地方,就是豆瓣长评可能会有无评价等级的评论,就是没有<spanclass="allstar40main-title-rating"title="推荐"></span>这项标签,会对我们的爬虫,对应每个评论的信息有影响,通过分析,这种评论一般会带有<spancontent="2021-06-14"class="main-meta">这样的标签,通过检测这个标签,就可以知道有那个评论说没有给出评价等级的。爬取效果如下图4爬取电影评论页面效果2.2爬取豆瓣详细评论 根据爬取的文章id构造/review/文章id,进行请求,根据爬取下来的html进行分析(图5),我们需要爬取<divclass="review-contentclearfix"data-author=""data-url=""data-original="0">这个html标签下的内容,就是完整文章,爬取完整的文章然后进行词频统计,去除停止词后通过TD-IDF算法提取关键词,并且通过结巴分词存储词频,形成一个词频词典,作为文章结构化时的特征向量。图5html分析图6爬取每篇评论的效果2.3应对反爬虫措施豆瓣的影评经过我多次爬取,貌似没有什么反爬虫措施,这里使用了fake_useragent这个库,随机生成浏览器的ua放在请求头中,每次使用一个随机的ua进行请求。然后利用不同的cookie进去请求。2.4爬虫部分代码

#爬取某篇电影下的评论html

=

get_movie_html(34913671,0)

html1

=

html.text.encode(encoding="utf-8")

#print

(type(html1))

#print

(html1)

#file

=

open(r"J:\\vscode\爬虫\test.txt",

"w+b")

#file.write(html1)

soup

=

BeautifulSoup(html.text,

'lxml')

#使用soup库

title

=

soup.title.string

#获取网页标题,得到评论数以及电影名

title

=

title.replace('

',

'')

title

=

title.replace('\n',

'')

len_title

=

len(title)

for

i

in

range

(0,len_title):

if(title[i]

==

'('):

flag1=i

if(title[i]

==

')'):

flag2=i

#print(str(flag1)+'

'+str(flag2))

movie_name

=

title[0:flag1-3]

print

('电影名:'+

movie_name)

print

('该电影的评论数为'+title[flag1+1:flag2])

reviewer_id=[]

#用户id

review_level=[]

#评价等级

review_detailed_id=[]

#文章id

reviewer_ids=soup.find_all('a',class_="name")

for

reviewer_id_1

in

reviewer_ids:

#爬出用户

reviewer_id.append(reviewer_id_1.text)

#print(reviewer_id_1.text)

#爬出评价等级

review_levels=soup.find_all('header',class_="main-hd")

'''

力荐=5星

推荐=4星

还行=3星

较差=2星

很差=1星

'''

for

review_level_1

in

review_levels:

review_level_1=review_level_1.find('span')

if

review_level_1['class'][0]

==

'main-meta':

#经过研究如果用户没有给评价就会具有这个特征

review_level.append('无评价')

else

:

review_level.append(review_level_1['title'])

#print(review_level_1['class'][0])

review_detailed_ids=soup.find_all('div',class_="review-short")

#爬取评论文章的id

for

review_detailed_ids_1

in

review_detailed_ids:

review_detailed_id.append(review_detailed_ids_1['data-rid'])

#print(review_detailed_ids_1['data-rid'])

for

i

in

range(0,10):

print

(reviewer_id[i]+'

评价:'+review_level[i]+'

详细评价文章url的id

:'+review_detailed_id[i])

#爬取5篇该电影下的详细文章for

i

in

range(0,5):

print

('正在爬取第

'+str(i+1)+'

篇详细评论')

html_detail

=

get_movie_full_review(review_detailed_id[i])

#爬取评论细节

#print

(html_detail.text)

html_detail

=

html_detail.text.encode(encoding="utf-8")

soup_review

=

BeautifulSoup(html_detail,

'lxml')

#使用soup库

review_alls=soup_review.find_all('div',class_="review-content

clearfix")

review_all_title=soup_review.find('meta',property="og:title")

movie_review_title.append(review_all_title['content'])

movie_full_review_all.append(review_all_title['content'])

#print

(review_all_title['content'])

for

review_all

in

review_alls:

#把标题和评论细节一起爬下来,然后都添加在review_fenci_all中

'''title_de

=

soup_review.title.string

title_de

=

title_de.replace('

',

'')

title_de

=

title_de.replace('\n',

'')'''

#print

(title_de)

#print

(review_all.text)

#movie_full_review_all.append(title_de)

movie_full_review_all[i]

+=

''

movie_full_review_all[i]

+=

review_all.text

#print

(movie_full_review_all[i])

list_fenci.append(fenci_plv(movie_full_review_all[i]))

print

("词典已记录")

review_fenci_all+=movie_full_review_all[i]3.推荐部分3.1.文章结构化首先根据之前爬取的评论,统计爬取的全部评论的TD-IDF前10的关键词,作为关键词列表。(这里的TD-IDF是使用的结巴分词自带的预料库,根据我的测试,提取出来的关键词很符合文章特征)然后根据各个评论词频前10的关键词进行对比,取具有相同关键词的词频作为关键词矩阵的向量,这里只爬取5篇评论,制作出来的矩阵如下,这里取之前爬取的评价星级作为最后一个向量参数。 以上面爬取的《哆啦a梦,伴我同行》这部电影形成的文章关键词矩阵如下图7关键词矩阵计算关键词的矩阵的部分代码,使用之前爬取评论时创建的分词字典

jvzhen_list=[[0]

*

11

for

i

in

range(5)]

#创建的临接矩阵值

'''

list_fenci

0.第几个评论

1.评论关键词

2.评论关键词频率

review_fenci_all_list

0.总评论关键词

1.关键词频率

'''

flag_pinlun=0

for

z

in

range

(0,5):

#表示第几个评论

for

j

in

range

(0,10):

#表示矩阵的列(第z个评论的词频)

#jvzhen_list[z].append(0)

#先填充0

for

i

in

range

(0,10):

#循环,与总词频率对比

#print

(review_fenci_all_list[j][0])

#print

(list_fenci[0][i][0]+'\n')

if

list_fenci[z][i][0]

==

review_fenci_all_list[j][0]:

jvzhen_list[z][j]

=

round(list_fenci[z][i][1],2)

#print

(1)

#print

(jvzhen_list)

#把之前爬取的评价加入临接矩阵

'''

力荐=5星

推荐=4星

还行=3星

较差=2星

很差=1星

'''

for

i

in

range(0,5):

#print

(jvzhen_list[i][10])

if

review_level[i]

==

"力荐"

:

jvzhen_list[i][10]

=

5

elif

review_level[i]

==

"推荐"

:

jvzhen_list[i][10]

=

4

elif

review_level[i]

==

"还行"

:

jvzhen_list[i][10]

=

3

elif

review_level[i]

==

"较差"

:

jvzhen_list[i][10]

=

2

elif

review_level[i]==

"很差"

:

jvzhen_list[i][10]

=

1

else:

jvzhen_list[i][10]

=

03.2计算相似度矩阵 得到文章的关键词向量矩阵后,通过余弦计算公式计算每个关键词向量的相似度图8余弦公式根据上面爬出来的数据,计算得出的评论相似度矩阵如下图9根据余弦公式计算的相似度矩阵部分代码如下

#创建相似度的矩阵,循环计算余弦相似度

cos_jvzhen=[[0]

*

5

for

i

in

range(5)]

for

i

in

range(0,5):

#表示第几个评论和第j个评论的相似度

for

j

in

range(0,5):

cos_jvzhen[i][j]

=

round(cosine_similarity(np.array(jvzhen_list[i]),np.array(jvzhen_list[j])),2)3.3用户矩阵由于我不能获取豆瓣用户的详细操作数据,所以用户矩阵只能我自己进行模拟,然后根据用户的评分进行推荐度计算,这里由于豆瓣的影评只有“有用”和“没用”2种,这里设有用为1,没用为-1,没看过该影评为0,模拟5个用户的评价创建一个矩阵。图10模拟的用户矩阵3.4计算推荐度根据下面这个公式计算每个用户没看过影评与其看过影评的相似度的权值计算出用户没看过影评的相似度,然后再进行排序,得出推荐影评论列表没看过影评的推荐度=(与每个看过影评的相似度部分代码如下#计算推荐度

tuijian=[[]

for

i

in

range(5)]

#创建推荐度的列表

for

z

in

range(0,5):

#表示用户矩阵

for

i

in

range(0,5):

#看第几个评论为0

if

user_jvzhen[z][i]

==

0:

#print

(i)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论