03 爬蟲實例-獲取網頁彈幕內容

練習:爬取嗶哩嗶哩網頁彈幕內容,並將爬取的內容以五角星的形式顯示出來

 

 需求實現

思路:

  1. 向嗶哩嗶哩網站發送請求
  2. 請求成功後,解析爬取的彈幕內容保存到一個文件中
  3. 讀取文件並分析彈幕內容中詞組或文字出現的頻率
  4. 將這些詞組或文字組成五角星圖形
  5. 組成五角星圖形後,以圖片的形式輸出

實現:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # author:albert time:2019/10/28
 4 import requests
 5 from bs4 import BeautifulSoup
 6 import pandas as  pd
 7 import re
 8 import jieba
 9 from wordcloud import WordCloud
10 from imageio import imread
11 import matplotlib.pyplot as plt
12 
13 '''
14 --獲取網站彈幕列表內容
15 '''
16 # 網頁地址,該地址只針對嗶哩嗶哩彈幕網有效,獲取方式查看
17 url = "http://comment.bilibili.com/124001121.xml"
18 
19 # 網站訪問的用戶代理,建議攜帶,不攜帶可能沒法訪問
20 header = {
21     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
22 }
23 
24 # 向對方服務器發送請求,返回訪問狀態,
25 # 返回狀態若是是以[2]開頭,表示訪問成功,[4]開頭表示網頁不存在,[5]開頭網站內部錯誤
26 # 訪問狀態沒法直接讀取,需經過屬性[text]獲取
27 response = requests.get(url,header)
28 
29 # 獲取網頁的編碼規則,建議經過該方式獲取,而不是直接賦值,可能存在設置不對的狀況,可能不是中文網頁
30 # response.encoding = "utf-8"
31 response.encoding = response.apparent_encoding
32 # print(response.text)
33 
34 # 獲取網頁文本內容
35 data = response.text
36 '''
37 --將獲取到的彈幕內容處理後存放在txt文件中,並讀取出來
38 --網頁獲取的彈幕內容是帶html標籤的,須要將標籤和非漢字的內容清除
39 '''
40 # 解析文本xml,處理不規範標記並生成剖析樹
41 soup = BeautifulSoup(data,'lxml')  
42 # print(soup)
43 # 獲取全部<d>標籤中的內容,此時是帶標籤的文本內容
44 d_list = soup.find_all('d')
45 
46 # 去掉<d>標籤,將文本內容存在在列表dlst
47 dlst = []
48 for d in d_list:
49     danmu = {}
50     danmu['彈幕'] = d.text  # 循環獲取全部<d>標籤中內容
51     dlst.append(danmu)
52 
53 df = pd.DataFrame(dlst) # 將列表dlst中的內容存放在數據集中,相似於Excel表格
54 # print(df)
55 
56 # 建立並打開一個文件
57 f = open('cl.txt','w',encoding='utf-8')
58 # 進行文本過濾
59 for i in df['彈幕'].values: # 遍歷數據集中的全部的彈幕內容
60     pat = re.compile(r'[一-龥+]')    # 定義過濾規則,只保留中文漢字,該正則表達式幾乎包含了全部漢字龥(yu,第四聲)
61     filter_data = re.findall(pattern=pat,string=i)     # 執行過濾操做
62     f.write(''.join(filter_data))     # 將過濾後的彈幕內容寫入建立的[cl.txt]文件中
63 f.close()
64 
65 '''
66 --讀取彈幕內容所在的文件[cl.txt]
67 '''
68 f1 = open('cl.txt','r',encoding='utf-8')
69 data = f1.read()
70 
71 '''
72 --將彈幕內容分割成詞組,並組合成五角星的圖案
73 '''
74 result = " ".join(jieba.lcut(data))
75 
76 f1.close()
77 color_mask = imread("五角星.jpg")         # 設置數據組合的圖形,最好使用空心的圖片
78 wc = WordCloud(
79     font_path="C:\Windows\Fonts\simsun.ttc",        # 數據顯示的字體
80     width=1000,
81     height=800,
82     background_color='white',       # 詞雲的背景色
83     mask=color_mask         # 詞雲組成的圖形,默認爲二維
84 )
85 
86 wc.generate(result)     # 將彈幕內容生成詞雲
87 wc.to_file('clanned.png')       # 詞雲輸出文件
88 
89 '''
90 --顯示彈幕內容組成的圖片
91 '''
92 plt.imshow(wc)
93 plt.show()

使用到的類庫,若是沒有,須要下載,下載命令:html

pip install requests
pip install bs4
pip install pandas
pip install lxml        # 在解析xml文件時,須要使用
pip install jieba
pip install wordcloud
pip install imageio
pip install matplotlib

 

知識點:

  • request 向對方服務器發送請求
  • BeautifulSoup 解析爬取的彈幕內容
  • pandas 分析彈幕數據
  • jieba 中文分詞器,或稱爲中文詞組切片器
  • wordcloud 加載彈幕文本,並輸出文件(這裏使用圖片的方式輸出)
  • matplotlib.pyplot 將整理後的彈幕文本以圖形的方式輸出(這裏是以五角星的圖片爲例)
  • imread 讀取圖片

問題:

  •  爬取的彈幕內容被保存在了文件後,後又從新讀取,是否能夠不存放在文件中,直接使用列表或者其餘對象存儲,而後再讀取?保存在文件和直接讀取的優缺點是什麼?
  • 彈幕內容中除了漢字,實際上還包含了大量的字母,表情符號,這些內容能夠經過什麼正則表達式進行篩選,可否同時跟漢字一塊兒篩選出來?
  • 在導包的時候,使用[from scipy.misc import imread]報錯,用[from imageio import imread]代替便可。爲何使用scipy.misc中的imread報錯?
相關文章
相關標籤/搜索