python爬虫案例:爬取大学数据生成统计图

164 阅读3分钟

注意事项

保存python文件时注意文件名不要与需要安装的包发生重复

爬取网页数据生成表格


import requests
from bs4 import BeautifulSoup
import pandas as pd

ulist = []
# 爬取的网站的URL
url = "http://www.gaosan.com/gaokao/241219.html"
response = requests.get(url)
# 编码格式
response.encoding = 'utf-8'
# 编译数据
soup = BeautifulSoup(response.text, 'html.parser')
# 将数据存入定义好的ulist
for tr in soup.find('tbody').children:
    tds = tr('td')
    ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string, tds[4].string, tds[5].string])
# 获取指定数量的大学并打印:
    # {:^10}表示将元素居中对齐,宽度为10个字符。
    # \t表示制表符,用于分隔不同的列。
    # chr(12288)通常用于中文文本的排版,以保持整齐的对齐。
for i in range(21):
    u = ulist[i]
    print("{:^10}\t{:^20}\t{:^10}\t{:^10}\t{:^10}\t{:^10}".format(u[0], u[1], u[2], u[3], u[4], u[5], chr(12288)))
# 创建一个pandas DataFrame对象
df = pd.DataFrame(ulist[1:21], columns=ulist[0])

# 将数据保存到Excel文件中
df.to_excel('学校排名.xlsx', index=False)

这里需要安装两个包 pip install pandas pip install requests

找到生成的表格

image.png

生成柱状图

import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts

# 读取Excel文件
file_path = '学校排名.xlsx'
df = pd.read_excel(file_path)

# 统计'所在地区'列中各个地区的出现次数。
department_count = df['所在地区'].value_counts()

# 绘制柱状图
bar = (
    Bar()
    # 将'所在地区'列中各个地区的名称添加到图表的X轴上。
    .add_xaxis(department_count.index.tolist())
    # 将'所在地区'列中各个地区的出现次数添加到图表的Y轴上,并将这个数据系列命名为"数量"。
    .add_yaxis("数量", department_count.values.tolist())
    # 设置图表的全局选项。这里将图表的标题设置为"不同省份的大学数量"。
    .set_global_opts(title_opts=opts.TitleOpts(title="不同省份的大学数量统计"))
)

# 生成HTML文件
bar.render('A-不同省份的大学数量.html')

这里注意安装pyecharts.charts包时,代码为pip install pyecharts

安装Bar包时,注意大小写敏感:pip install Bar

安装options包:pip install options

生成饼状图

import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts

file_path = '学校排名.xlsx'
df = pd.read_excel(file_path)

# 统计各学历人数
education_count = df['办学层次'].value_counts()

# 绘制饼图
pie = (
    Pie()
    # 将办学层次和对应的数量作为数据添加到饼图中。
    # 其中,education_count是一个包含办学层次和对应数量的Series对象
    # 通过zip函数将两个列表合并成一个元组列表,再使用list函数将其转换为列表形式。
    # 最后,使用add方法将数据添加到饼图中,并设置系列名称为"数量"。
    .add("数量", [list(z) for z in zip(education_count.index.tolist(), education_count.values.tolist())])
    # 设置饼图的全局配置项。这里设置标题为"办学层次大学占比统计"。
    .set_global_opts(title_opts=opts.TitleOpts(title="办学层次大学占比统计"))
    # 设置饼图的标签格式。label_opts参数用于设置标签选项,opts.LabelOpts方法用于创建一个标签选项对象,并设置标签格式为"{b}: {c}"。
    # 其中{b}表示办学层次,{c}表示数量。这样设置后,饼图中每个扇区的标签将显示为"教育层次: 数量"的形式。
    # formatter作用: 格式化标签的参数。{b}、{c}代表占位符。
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

# 生成HTML文件
pie.render('A-办学层次大学占比统计.html')

生成散点图

import pandas as pd
from pyecharts.charts import Scatter
from pyecharts import options as opts

# 读取Excel表格数据
file_path = '学校排名.xlsx'
df = pd.read_excel(file_path)

# 提取’星级排名‘和’综合分数‘数据
rank = df["星级排名"].tolist()
score = df["综合得分"].tolist()

# 创建散点图对象
scatter = Scatter()

# 添加X轴数据
scatter.add_xaxis(rank)
# 添加Y轴数据
scatter.add_yaxis("综合得分", score)

# 设置全局选项
scatter.set_global_opts(
    # 设置标题名称
    title_opts=opts.TitleOpts(title="综合得分与星级排名关系散点图"),
    # 设置X轴名称
    xaxis_opts=opts.AxisOpts(name="星级排名"),
    # 设置Y轴名称以及纵坐标的大小
    yaxis_opts=opts.AxisOpts(name="综合得分",min_=70, max_=100),
)

# 渲染图表
scatter.render("A-综合得分与星级排名关系散点图.html")