堪比甄嬛傳的延禧!我媽天天看!爬取評論,和老媽找點話題聊天!

来源:https://www.cnblogs.com/PY08523/archive/2018/09/05/9594565.html
-Advertisement-
Play Games

最近宮鬥劇《延禧攻略》大火,大家稱贊的原因除了劇情,演員的演技之外,還有精良的製作,甚至有人給出了高顏值的歷史教科書的評價,初次之外,某些反派角色的飾演者的微博更是被“正義”的觀眾給攻陷了。本文將通過爬取評論區的評論,來看看小伙伴都在熱議啥。 本文分兩大部分,第一部分是爬蟲部分,爬取評論區信息;第二 ...


最近宮鬥劇《延禧攻略》大火,大家稱贊的原因除了劇情,演員的演技之外,還有精良的製作,甚至有人給出了高顏值的歷史教科書的評價,初次之外,某些反派角色的飾演者的微博更是被“正義”的觀眾給攻陷了。本文將通過爬取評論區的評論,來看看小伙伴都在熱議啥。

本文分兩大部分,第一部分是爬蟲部分,爬取評論區信息;第二部分對數據進行分析。

爬蟲部分

前期分析

這裡我們選取豆瓣上的評論作為目標,與一般的爬蟲無異,首先是分析網站信息,分析的方法與之前的爬蟲例子一樣:廣西某211高校新聞爬取,城市空氣質量爬取。

經過分析,發現評論區每個頁面存放20條評論,每條評論有一個單獨的頁面,因此採取的方法位逐一獲取每個頁面的評論列表,提取每條評論的鏈接,再獲取其評論內容。這裡我們選擇爬取前150頁的評論信息。

經過以上分析,可以確定程式需要做的工作如下:從第1頁到第150頁逐一獲取評論列表,接著逐一獲取每條評論的文本內容。因逐一獲取評論列表內容較多,因此考慮採取多線程的爬取方式,每30頁為一個線程進行爬取。

代碼編寫

  1. 小編在此謝謝大家的觀看!Python很容易學!所以小編有弄一個交流,互問互答,資源共用的交流學習基地,如果你也是Python的學習者或者大牛都歡迎你來!㪊:548+377+875!一起 學習共同進步!

接著開始編寫代碼的基本框架,首先需要有一個向頁面發起請求的函數;接著需要有解析評論列表頁面的函數,用來獲取每個評論的鏈接;對於每一個評論頁面,也需要進行解析;對於獲取到的評論內容,需要進行保存。因此,整個函數的基本結構應該如下:

堪比甄嬛傳的延禧!我媽天天看!爬取評論,和老媽找點話題聊天!

 

get_html()函數用於需要發起url請求獲取信息,這裡用到requests庫的get方法:

def get_html(url):
# 構造請求頭
headers = {'User-Agent':'Mozilla/5.0'}
# 隨機暫停
t = random.randint(2,15)
print(' 暫停{}s'.format(t))
time.sleep(t)
# 發起請求獲取html
r = requests.get(url,headers=headers)
html = r.text
return html

我們首先需要獲取的是評論列表的頁面,先獲取每條評論的鏈接才能獲取評論內容。因此,我們使用parser_page_list()函數解析評論列表頁面的信息,使用parser_per_comment()函數解析每條評論的信息:

# 解析每條評論的網頁,獲取評論內容
def parser_per_commet(html,from_page,end_page):
# 保存每一個評論頁面的評論標題以及內容
soup = BeautifulSoup(html,'html.parser')
title = soup.find('div',{'id':'content'}).find('h1').text.strip()
p = soup.find('div',{'id':'link-report'}).find('span',{'class':''}).find_all('p')
content = ''
for i in range(len(p)):
content += p[i].text.strip()
save_file(title,content,from_page,end_page)
# 解析每個評論列表頁面,獲取每條評論的鏈接
def parser_page_list(html,from_page,end_page):
# 獲取每個評論列表頁面的href鏈接
soup = BeautifulSoup(html,'html.parser')
tr = soup.find('table',{'class':'olt'}).find_all('tr')
hrefs = []
for i in range(1,len(tr)):
href = tr[i].find('a').get('href')
hrefs.append(href)
# print(hrefs)
for href in hrefs:
try:
# 每隔若幹秒開始爬取評論的標題和內容
time.sleep(random.randint(3,15))
html = get_html(href)
parser_per_commet(html,from_page,end_page)
except:
continue

由於加了延時爬取,單線程爬取150個頁面的評論會變慢,除此之外,由於一個IP地址頻繁的訪問網站,很容易會出髮網站的反爬機制。因此,加入了多線程,每個線程爬取30頁的評論內容:

# 每條線程的開始頁面以及結束頁面
def from_to_thread(from_page,end_page):
for i in range(from_page,end_page):
yx_dicussion_url = 'https://movie.douban.com/subject/26999852/discussion/?start={}&sort_by=time'.format(i*20)
time.sleep(random.randint(5,20))
html = get_html(yx_dicussion_url)
parser_page_list(html,from_page,end_page)
if __name__ == '__main__':
for i in range(0,150,30):
from_to_ = threading.Thread(target=from_to_thread,args=(i,i+29))
from_to_.start()

最後的文件保存,為避免多線程之間讀寫同一變數造成不可預知的錯誤,因此保存文件時,採取了一個線程對應保存一個文件的方式:

# 保存評論內容
def save_file(title,content,from_page,end_page):
with open('yxgl_{}_{}.txt'.format(from_page,end_page),'a',encoding='utf-8') as f:
f.write(title + ' ' + content + ' ')

分析統計

詞雲分析

對於文本內容的分析,採取詞雲的方式直觀展示。詞雲的用法可以參照之前的例子:《核安全法》詞雲統計,以下為實現代碼:

# 獲取所有txt文件,讀入內容
def get_word():
files = []
for file in os.listdir('.'):
if file.endswith('.txt'):
files.append(file)
total_content = ''
for file_num in range(len(files)):
with open(files[file_num],'rb') as f:
txt = f.read()
decode_txt = txt.decode('utf-8')
total_content += decode_txt
words_ls = jieba.lcut(total_content)
return words_ls
# 生成詞雲
def ciyun():
mk = imread('qianlong.jpg')
words_ls = get_word()
words = ' '.join(words_ls)
w = wordcloud.WordCloud(mask=mk,font_path='msyh.ttc',background_color='white')
w.generate(words)
w.to_file('延禧詞雲.png')
print('詞雲生成成功!')

以下為詞雲效果,主角永遠都是討論的焦點:

堪比甄嬛傳的延禧!我媽天天看!爬取評論,和老媽找點話題聊天!

 

詞頻統計

評論區大家討論最多的是哪些角色呢?我們通過詞頻統計來看下。詞頻統計採取字典的get方法,詳細可見前面的介紹:《水滸傳》詞頻統計,組合數據類型(2)。我們統計出現最多的前十名,以下為實現代碼:

def ciping():
words = get_word()
# print(words)
counter = {}
del_words = [
' ','一個','沒有','自己','就是','覺得','這個','真的','...','什麼','不是','還是',
'喜歡','延禧','但是','攻略','知道','看到','劇情','這麼','可以','時候','最後','怎麼','感覺',
'演技','那麼','所以','其實','為什麼','這樣','為了','還有'
]
for word in words:
if len(word) == 1:
continue
elif word == '女主':
return_word = '瓔珞'
elif word == '乾隆' or word == '皇帝':
return_word = '皇上'
else:
return_word = word
counter[return_word] = counter.get(return_word,0) + 1
for word in del_words:
del counter[word]
ls = list(counter.items())
ls.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
print(ls[i])

運行後的結果為:

堪比甄嬛傳的延禧!我媽天天看!爬取評論,和老媽找點話題聊天!

 

可以看到主角毫無疑問的第一位,接下來就是大豬蹄子乾隆皇帝,溫文爾雅的皇後位居第三,袁春望出現在前十有點意外。不知道《延禧》,你給幾分?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0×00 介紹 0×01 要求 0×02 你能學到什麼? 0×03 知識補充 0×04 最簡單的開始 0×05 更優雅的解決方案 0×06 url合法性判斷 0×07 總結與預告 0×00 介紹 學習Python中有不明白推薦加入交流群 號:548377875 群里有志同道合的小伙伴,互幫互助, 群 ...
  • 我發現我不適合看視頻學習,看書看文字覺得更舒服,看大神的博客教程:https://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html,一篇篇看下去,碎片時間看,收穫很多。 ...
  • 今天工作過程中遇到了一個問題:有兩個工程,就叫做 " I " 和 " M " 吧。項目 I 寫了JSP的結構,樣式,數據取得;項目 M 包含頁面的跳轉 頁面的header部分由M載入出來, 表信息通過<jsp:include>引出項目 I 的內容。 可是!!我 I 部分的畫面!就是載入不出來!!!Q ...
  • 依賴註入: 通過依賴註入來實現從不同的子公司採集數據,比如從唐山子公司、承德子公司和吉林子公司這三個地方採集,步驟如下: (1)編寫介面DataManagement介面 public interface DataManagement{ public void getData(); } (2)編寫具體 ...
  • 大家好,我也是一名新的java小白,今天是我的第一篇文章,心情非常激動。初次發表請多關照。 第一篇文章完全是自己寫的,喜歡的可以關註,不喜歡的也可以多多建議。今天我遇到了一個SSM中常見的錯誤在這裡給大家分享一下。並提供自己的解決方式 因為SSM個人覺得有的方法需要配置大量的.xml文件有些繁瑣,有 ...
  • 小編前兩天在知乎上面看到一個帖子發佈於2014年,作者說他在2012的時候用Python寫自動化交易程式,賺了200W。 小編也抱著比較懷疑的態度去找一些資料發現,這個居然是真的,2012-2014年居然能用Python賺到200W,而且還是躺著賺錢的那種,還是六年前,想想就覺得Python還是挺可 ...
  • Hello 大家好,我又來啦,今天我們來說說Java的面向對象。 還記得之前去面試幾家公司的實習生職位,大部分面試官都問過我有關面向對象 的問題,不知道以後還會不會問,估計是不會了吧。。。(:3[▓▓] 下麵我們來說正事!(≖ ‿ ≖)✧ 面向對象特點有四個——封裝、繼承、多態、抽象 封裝: 封裝的 ...
  • 前言 由於大量的計算都是在本地完成的,而游戲又是運行在記憶體中,那麼導致了我們有很多種方法進行利用。 絕地求生游戲體驗度極差,不是說游戲差,相反游戲做的體驗度是非常棒的,不然也不會有那麼多讓人去玩。只是不管任何段位都有很多神仙啊!我們都只是凡人,凡人不配擁有游戲體驗,神仙都是孤兒! 學習Python中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...