1. 程式人生 > 其它 >20214302《Python程式設計》實驗四 Python綜合實踐實驗報告

20214302《Python程式設計》實驗四 Python綜合實踐實驗報告

20214304《Python程式設計》實驗四 Python綜合實踐實驗報告

 

課程:《Python程式設計》
班級: 2143
姓名: 單宇航
學號: 20214302
實驗教師:王志強
實驗日期:2022年5月27日
必修/選修:公選課

 

一、實驗內容

1.實驗題目:

Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
課代表和各小組負責人收集作業(原始碼、視訊、綜合實踐報告)

注:在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現。

2.實驗內容:

爬蟲+資料處理+視覺化  

   利用爬蟲爬取Bilibili動漫排行榜的資訊並儲存到本地txt檔案中,將其中的相關資料儲存到excel表格中(即動漫的名字、更新集數、播放量、收藏量),將其進行視覺化處理,即製作出播放量與收藏量的柱狀圖和條形圖進行比較和分析。

網址:https://www.bilibili.com/v/popular/rank/bangumi

 

 

 

 

二、實驗過程及結果  

 

實驗過程:

1.呼叫庫:re, pandas, bs4(BeautifulSoup), matplotlib.pyplot, openpyxl

import re
import pandas
import requests
from bs4 import BeautifulSoup import matplotlib.pyplot as plt from matplotlib import font_manager

2.進行網頁內容的爬取和儲存

def main():
    url = 'https://www.bilibili.com/v/popular/rank/bangumi'  # 所要爬取的網址
    html = get_html(url)  # 獲取返回值
    # print(html)
    info = save(html)   
    view(info)         # 重新調整張量維度,張量(Tensor)的目的是能夠創造更高維度的矩陣、向量
def get_html(url): try: r = requests.get(url) # 使用get來獲取網頁資料 r.raise_for_status() # 如果返回引數不為200,丟擲異常 r.encoding = r.apparent_encoding # 獲取網頁編碼方式 return r.text # 返回獲取的內容 except: return '錯誤' # 解析網頁 def save(html): soup = BeautifulSoup(html, 'html.parser') # 指定Beautiful的解析器為“html.parser” with open('D:/爬蟲測試/data1.txt', 'r+', encoding='UTF-8') as f: f.write(soup.text)

 

 

3.將所需資訊從爬取的內容中提取出來

 

    # 定義好相關列表準備儲存相關資訊
    name = []  # 動漫名字
    jsk = []   #集數庫
    bfl = []  # 播放量
    scs = []  # 收藏數


    # ********************************************  動漫名字儲存
    for tag in soup.find_all('div', class_='info'):
        # print(tag)
        bf = tag.a.string
        name.append(str(bf))
    print(name)

    # ********************************************  動漫集數
    for tag in soup.find_all('div', class_='detail'):
        # print(tag)
        js = tag.find('span', class_='data-box').get_text()
        js = re.search(r'\d*(\.)?\d', js).group()
        jsk.append(int(js))
    print(jsk)
    # ********************************************  動漫播放量
    for tag in soup.find_all('div', class_='detail-state'):
        # print(tag)
        bf = tag.find('span', class_='data-box').get_text()
        # 統一單位為‘萬’
        if '' in bf:
            num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
            # print(num)
            bf = num
        else:
            bf = re.search(r'\d*(\.)?\d', bf).group()
        bfl.append(float(bf))
    print(bfl)

    # ********************************************  收藏數
    for tag in soup.find_all('div', class_='detail-state'):
        sc = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
        sc = re.search(r'\d*(\.)?\d', sc).group()
        scs.append(float(sc))
    print(scs)

#黃色部分下面內容會講

 

4.將上述資料存入excel表格

    # 儲存至excel表格中
    info = {'動漫名': name,'集數庫': jsk, '播放量(萬)': bfl, '收藏數(萬)': scs}     
    dm_file = pandas.DataFrame(info)
    dm_file.to_excel('Data.xlsx', sheet_name="動漫資料分析")
    # 將所有列表返回
    return name, jsk, bfl, scs

 

5.製作柱狀圖和折線圖


#使圖上的資料可以顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #執行配置引數中的字型(font)為黑體(SimHei
plt.rcParams['axes.unicode_minus'] = False #執行配置引數總的軸(axes)正常顯示正負號(minus
# **********************************************************************播放量和收藏量數對比
# *******播放量條形圖
fig, ax1 = plt.subplots()
plt.bar(dm_name, dm_play, color='cyan')
plt.title('播放量和收藏量資料分析')
plt.ylabel('播放量(萬)')
ax1.tick_params(labelsize=6)
plt.xticks(rotation=90, color='green')

# *******收藏量折線圖
ax2 = ax1.twinx() # 組合圖必須加這個
ax2.plot(dm_favorite, color='green') # 設定線粗細,節點樣式
plt.ylabel('收藏量(萬)')
plt.plot(1, label='播放量', color="cyan", linewidth=5.0)
plt.plot(1, label='收藏量', color="green", linewidth=1.0, linestyle="-")
plt.legend()
plt.savefig(r'D:/爬蟲測試/1.png', dpi=1000, bbox_inches='tight')


plt.show()

 

5.最後設定python程式的模擬入口,正確的入口對應出口

if __name__ == '__main__':
    main()

 

6.最終完整程式碼:

import re
import pandas
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
from matplotlib import font_manager


def get_html(url):
try:
r = requests.get(url) # 使用get來獲取網頁資料
r.raise_for_status() # 如果返回引數不為200,丟擲異常
r.encoding = r.apparent_encoding # 獲取網頁編碼方式
return r.text # 返回獲取的內容
except:
return '錯誤'


def save(html):
# 解析網頁
soup = BeautifulSoup(html, 'html.parser') # 指定Beautiful的解析器為“html.parser”

with open('D:/爬蟲測試/data1.txt', 'r+', encoding='UTF-8') as f:
f.write(soup.text)

# 定義好相關列表準備儲存相關資訊
name = [] # 動漫名字
jsk = [] #集數庫
bfl = [] # 播放量
scs = [] # 收藏數


# ******************************************** 動漫名字儲存
for tag in soup.find_all('div', class_='info'):
# print(tag)
bf = tag.a.string
name.append(str(bf))
print(name)

# ******************************************** 動漫集數
for tag in soup.find_all('div', class_='detail'):
# print(tag)
js = tag.find('span', class_='data-box').get_text()
js = re.search(r'\d*(\.)?\d', js).group()
jsk.append(int(js))
print(jsk)
# ******************************************** 動漫播放量
for tag in soup.find_all('div', class_='detail-state'):
# print(tag)
bf = tag.find('span', class_='data-box').get_text()
# 統一單位為
if '' in bf:
num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
# print(num)
bf = num
else:
bf = re.search(r'\d*(\.)?\d', bf).group()
bfl.append(float(bf))
print(bfl)

# ******************************************** 收藏數
for tag in soup.find_all('div', class_='detail-state'):
sc = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
sc = re.search(r'\d*(\.)?\d', sc).group()
scs.append(float(sc))
print(scs)

# 儲存至excel表格中
info = {'動漫名': name,'集數庫': jsk, '播放量()': bfl, '收藏數()': scs}
dm_file = pandas.DataFrame(info)
dm_file.to_excel('Data.xlsx', sheet_name="動漫資料分析")
# 將所有列表返回
return name, jsk, bfl, scs

def view(info):
#取出列表資料
dm_name = info[0] # 番劇名
dm_episodes = info[1] # 動漫集數
dm_play = info[2] # 番劇播放量
dm_favorite = info[3] # 番劇收藏數

#使圖上的資料可以顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #執行配置引數中的字型(font)為黑體(SimHei