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

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

创建虚拟环境

1
python -m venv virtual-env

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

安装第三方库

1
2
3
4
5
pip install requests # 安装requests库,用于爬取网页

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

pip install pandas # 安装pandas库,用于数据分析

爬取豆瓣电影 op250

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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()

学生成绩分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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)

检测到页面内容有更新,是否刷新页面