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

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...