Python 课程作业 - 简单爬虫和数据分析

#Python 2022/04/19 07:32:29
目录
  1. 创建虚拟环境
  2. 安装第三方库
  3. 爬取豆瓣电影 op250
  4. 学生成绩分析

女朋友的弟弟向她请教 Python 课程作业,一是利用 Requests 和 BeautifulSoup 爬取网页数据并导出,二是给出学生成绩表利用 Pandas 进行数据分析,感觉这两次作业的目的性很强,很好地体现了 Python 的作用,便在此梳理总结一下,方便日后快速回顾和学习。

创建虚拟环境
python -m venv virtual-env

命令会创建一个 virtual-enviroment 的文件夹,里面包含 python 编译器、标准库和其他一些文件,其中在 Scripts 文件夹下包含激活虚拟环境的执行文件。

安装第三方库
pip install requests # 安装requests库,用于爬取网页

pip install beautifulsoup4 # 安装beautifulsoup4库,用于解析网页

pip install pandas # 安装pandas库,用于数据分析
爬取豆瓣电影 op250
import requests
import csv
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
}
top_250 = []
csv_header = ["排名", "电影名称", "评分"]
# 获取网页源码
def getHTMLText():
    page = requests.get(URL, headers=headers)
    soup = BeautifulSoup(page.content, "html.parser")
    movie_list = soup.find_all("div", class_="item")
    for movie in movie_list:
        movie_rank = movie.find("em").string
        movie_name = movie.find("span", class_="title").string
        movie_score = movie.find("span", class_="rating_num").string
        fillUnivList(movie_rank, movie_name, movie_score)

# 填充数据
def fillUnivList(rank, name, score):
    top_250.append({"排名": rank, "电影名称": name, "评分": score})

# 向 csv 写入数据
def writeUListfile():
    with open("top_250.csv", "w", newline="") as f:
        f_csv = csv.DictWriter(f, csv_header)
        f_csv.writeheader()
        f_csv.writerows(top_250)

# 从 csv 读取数据
def printUniverList():
    with open("top_250.csv", "r", newline="") as fin:
        reader = csv.reader(fin)
        for row in reader:
            print(row)

# 循环读取豆瓣网页数据
for i in range(0, 226, 25):
    URL = f"https://movie.douban.com/top250?start={i}&filter="
    getHTMLText()
    writeUListfile()

printUniverList()
学生成绩分析
import pandas as pd

data = pd.DataFrame(
    {
        "学号": ["19000","19001","19002","19003","19004", "19005","19006","19007","19008","19009"],
        "姓名": ["Johnny","Mary", "Sara", "Micky","Jerry","Sunny","Sherry","Alice","Nala","Anna"],
        "程序设计": [88, 75, 95, 85, 58, 78, 56, 68, 73, 63],
        "体育": [91, 80, 90, 80, 76, 74, 70, 96, 86, 69],
        "英语": [76, 93, 89, 90, 86, 57, 76, 67, 64, 85],
        "高数": [67, 85, 91, 78, 89, 64, 67, 70, 91, 93],
    }
)

# 1.查询英语成绩不及格同学数据
nData = data[data["英语"] < 60]
print(nData)

# 2.增加一列数据,计算每个同学 4 门课程成绩总分
data["总分"] = data["程序设计"] + data["体育"] + data["英语"] + data["高数"]
print(data)

# 3.将程序设计课不及格的同学成绩改为 60 分
data.loc[data["程序设计"] < 60, "程序设计"] = 60
print(data)

# 4.采用基本统计函数计算并输出每门课程的平均分
print(data.loc[:, data.columns != "学号"].mean())

# 5.按总分从高到低排序,若总分相同,则按英语从高到低排序
data.sort_values(by=["总分", "英语"], ascending=[False, False], inplace=True)
print(data)

# 6.查程序设计成绩为优秀,同时高数也为优秀的学生数据
nData = data[(data["程序设计"] >= 90) & (data["高数"] >= 90)]
print(nData)

# 7.将程序设计成绩离散化处理,分成标签 不及格、及格、中、良、优秀,并增加一新列为程序设计分级
data["程序设计分级"] = pd.cut(
    data["程序设计"], [0, 59, 70, 80, 90, 100], labels=["不及格", "及格", "中", "良", "优秀"]
)
print(data)

# 8.在第(7)操作基础上,统计程序设计课 各分级人数
print(data["程序设计分级"].value_counts())

# 9.查英语成绩为良的学生学号、姓名、英语和高数几列数据
nData = data[(data["英语"] >= 80)]
print(nData[["学号", "姓名", "英语", "高数"]])

# 10.查姓名里包含大写字母 S 的学生数据。
nData = data[data["姓名"].str.contains("S")]
print(nData)