当前位置: 首页>后端>正文

python爬虫项目说明书 python爬虫项目报告

20214304《Python程序设计》实验四 Python综合实践实验报告

 

课程:《Python程序设计》班级: 2143
姓名: 单宇航
学号: 20214302
实验教师:王志强
实验日期:2022年5月27日
必修/选修:公选课

 

一、实验内容

1.实验题目:

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2.实验内容:

爬虫+数据处理+可视化  

   利用爬虫爬取Bilibilihtml" class="superseo">动漫排行榜的信息并保存到本地txt文件中,将其中的相关数据存储到excel表格中(即动漫的名字、更新集数、播放量、收藏量),将其进行可视化处理,即制作出播放量与收藏量的柱状图和条形图进行比较和分析。

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

python爬虫项目说明书 python爬虫项目报告,python爬虫项目说明书 python爬虫项目报告_数据,第1张

 

 

 

 

二、实验过程及结果

 

实验过程:

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)

https://www.xamrdz.com/backend/3ts1961984.html

相关文章: