網(wǎng)絡(luò)空間安全概論 實驗7網(wǎng)絡(luò)爬蟲 基于豆瓣長影評的內(nèi)容推_第1頁
網(wǎng)絡(luò)空間安全概論 實驗7網(wǎng)絡(luò)爬蟲 基于豆瓣長影評的內(nèi)容推_第2頁
網(wǎng)絡(luò)空間安全概論 實驗7網(wǎng)絡(luò)爬蟲 基于豆瓣長影評的內(nèi)容推_第3頁
網(wǎng)絡(luò)空間安全概論 實驗7網(wǎng)絡(luò)爬蟲 基于豆瓣長影評的內(nèi)容推_第4頁
網(wǎng)絡(luò)空間安全概論 實驗7網(wǎng)絡(luò)爬蟲 基于豆瓣長影評的內(nèi)容推_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

中國礦業(yè)大學(xué)計算機學(xué)院2018級本科生課程報告課程名稱信息內(nèi)容安全報告題目基于豆瓣長影評的內(nèi)容推薦報告時間2021.7.6姓名周宗文學(xué)號08182901任課教師曹天杰2020-2021(二)《信息內(nèi)容安全》課程報告評分表序號畢業(yè)要求課程教學(xué)目標考查方式與考查點占比得分12.3目標1:掌握信息內(nèi)容安全的基本概念、分類、原理和相關(guān)技術(shù),能夠根據(jù)課程基本知識對信息內(nèi)容安全領(lǐng)域出現(xiàn)的問題進行歸類、分析、并有初步分析和解決問題的能力。通過課堂講授和課堂研討掌握信息內(nèi)容安全概念和理論知識。40%3.2目標2:掌握信息內(nèi)容安全處理相關(guān)的理論、技術(shù)以及健全的評價體系,能夠根據(jù)具體問題分析算法、設(shè)計算法、實現(xiàn)算法并能綜合評價算法。24.3目標3:掌握信息內(nèi)容安全的基礎(chǔ)知識,針對具體問題和要求選擇正確的技術(shù)路線,通過在實驗環(huán)境中進行仿真實驗并能根據(jù)算法特點進行攻擊測試和綜合性能評價,得到具有參考價值的結(jié)論。課程報告;實現(xiàn)有關(guān)信息內(nèi)容安全的一個軟件系統(tǒng)。分析和對比各項技術(shù),選擇相應(yīng)的技術(shù)進行算法設(shè)計并在實驗環(huán)境中進行仿真實驗和性能評價,得到有效結(jié)論。60%總分100%評閱人:2021年7月10日目錄報告摘要 4報告正文 51.程序流程 52.爬蟲部分 62.1分析和爬取豆瓣電影長評頁面 62.2爬取豆瓣詳細評論 72.3應(yīng)對反爬蟲措施 82.4爬蟲部分代碼 83.推薦部分 103.1.文章結(jié)構(gòu)化 103.2計算相似度矩陣 123.3用戶矩陣 123.4計算推薦度 134.實現(xiàn)效果 13報告摘要關(guān)鍵詞:豆瓣長影評;爬蟲;影評推薦;基于內(nèi)容的推薦;根據(jù)在課堂上所學(xué)的內(nèi)容,觀察豆瓣長影評論頁面的特征,編寫了一個爬蟲實現(xiàn)可以自動爬取豆瓣某一電影下的所有長影評,實現(xiàn)對這些評論的分析,根據(jù)TD-IDF算法提取關(guān)鍵詞作為特征向量,計算各文章的相似度,最終實現(xiàn)對用戶推薦用戶沒有看過的,推薦度高的文章。

報告正文程序流程根據(jù)課堂上所學(xué)的知識,以及我的理解,我設(shè)計的程序流程是這樣的圖1程序流程圖以上就是我設(shè)計的程序流程。接下來就解析各部分的實現(xiàn)過程,這里簡化了程序,這個程序只爬取5篇評論,提取前10個關(guān)鍵詞進行相似度矩陣的計算,然后隨機生成5個用戶的用戶矩陣進行推薦度計算,然后根據(jù)計算出來的推薦值的大小,給用戶進行推薦。2.爬蟲部分2.1分析和爬取豆瓣電影長評頁面首先構(gòu)造url,觀察豆瓣的長影評基本都是/subject/+電影id+/reviews?start=,start值為評論頁數(shù),這種格式,構(gòu)造url把電影頁面的html文件爬取下來,分析我們要爬取的內(nèi)容所在的元素。圖2豆瓣電影頁面例如這個頁面,它是不顯示這篇文章的詳細內(nèi)容的,只有一個展開,我們爬下它的html頁面進行分析圖3需要爬取的標簽對于在這個頁面的評論,我只爬取每個評論下的<ahref="/people/204500361/"class="name">夏風(fēng)已至</a><h2><ahref="/review/13611559/">后半段高潮迭起</a></h2><spanclass="allstar40main-title-rating"title="推薦"></span>這幾個標簽,代表評價的用戶名,文章具體鏈接,以及對這個電影的評價,這里評價會在之后作為文章的特征向量,文章具體鏈接用于再次構(gòu)造請求爬取具體整篇文章。這里有一個特殊的地方,就是豆瓣長評可能會有無評價等級的評論,就是沒有<spanclass="allstar40main-title-rating"title="推薦"></span>這項標簽,會對我們的爬蟲,對應(yīng)每個評論的信息有影響,通過分析,這種評論一般會帶有<spancontent="2021-06-14"class="main-meta">這樣的標簽,通過檢測這個標簽,就可以知道有那個評論說沒有給出評價等級的。爬取效果如下圖4爬取電影評論頁面效果2.2爬取豆瓣詳細評論 根據(jù)爬取的文章id構(gòu)造/review/文章id,進行請求,根據(jù)爬取下來的html進行分析(圖5),我們需要爬取<divclass="review-contentclearfix"data-author=""data-url=""data-original="0">這個html標簽下的內(nèi)容,就是完整文章,爬取完整的文章然后進行詞頻統(tǒng)計,去除停止詞后通過TD-IDF算法提取關(guān)鍵詞,并且通過結(jié)巴分詞存儲詞頻,形成一個詞頻詞典,作為文章結(jié)構(gòu)化時的特征向量。圖5html分析圖6爬取每篇評論的效果2.3應(yīng)對反爬蟲措施豆瓣的影評經(jīng)過我多次爬取,貌似沒有什么反爬蟲措施,這里使用了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

#獲取網(wǎng)頁標題,得到評論數(shù)以及電影名

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

('該電影的評論數(shù)為'+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':

#經(jīng)過研究如果用戶沒有給評價就會具有這個特征

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])

#爬取評論細節(jié)

#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:

#把標題和評論細節(jié)一起爬下來,然后都添加在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.文章結(jié)構(gòu)化首先根據(jù)之前爬取的評論,統(tǒng)計爬取的全部評論的TD-IDF前10的關(guān)鍵詞,作為關(guān)鍵詞列表。(這里的TD-IDF是使用的結(jié)巴分詞自帶的預(yù)料庫,根據(jù)我的測試,提取出來的關(guān)鍵詞很符合文章特征)然后根據(jù)各個評論詞頻前10的關(guān)鍵詞進行對比,取具有相同關(guān)鍵詞的詞頻作為關(guān)鍵詞矩陣的向量,這里只爬取5篇評論,制作出來的矩陣如下,這里取之前爬取的評價星級作為最后一個向量參數(shù)。 以上面爬取的《哆啦a夢,伴我同行》這部電影形成的文章關(guān)鍵詞矩陣如下圖7關(guān)鍵詞矩陣計算關(guān)鍵詞的矩陣的部分代碼,使用之前爬取評論時創(chuàng)建的分詞字典

jvzhen_list=[[0]

*

11

for

i

in

range(5)]

#創(chuàng)建的臨接矩陣值

'''

list_fenci

0.第幾個評論

1.評論關(guān)鍵詞

2.評論關(guān)鍵詞頻率

review_fenci_all_list

0.總評論關(guān)鍵詞

1.關(guān)鍵詞頻率

'''

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):

#循環(huán),與總詞頻率對比

#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計算相似度矩陣 得到文章的關(guān)鍵詞向量矩陣后,通過余弦計算公式計算每個關(guān)鍵詞向量的相似度圖8余弦公式根據(jù)上面爬出來的數(shù)據(jù),計算得出的評論相似度矩陣如下圖9根據(jù)余弦公式計算的相似度矩陣部分代碼如下

#創(chuàng)建相似度的矩陣,循環(huán)計算余弦相似度

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用戶矩陣由于我不能獲取豆瓣用戶的詳細操作數(shù)據(jù),所以用戶矩陣只能我自己進行模擬,然后根據(jù)用戶的評分進行推薦度計算,這里由于豆瓣的影評只有“有用”和“沒用”2種,這里設(shè)有用為1,沒用為-1,沒看過該影評為0,模擬5個用戶的評價創(chuàng)建一個矩陣。圖10模擬的用戶矩陣3.4計算推薦度根據(jù)下面這個公式計算每個用戶沒看過影評與其看過影評的相似度的權(quán)值計算出用戶沒看過影評的相似度,然后再進行排序,得出推薦影評論列表沒看過影評的推薦度=(與每個看過影評的相似度部分代碼如下#計算推薦度

tuijian=[[]

for

i

in

range(5)]

#創(chuàng)建推薦度的列表

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論