20211102 尹子扬 《Python程序设计》 实验4报告
课程:《Python程序设计》
班级: 2111
姓名: 尹子扬
学号:20211102
实验教师:王志强
实验日期:2022年5月31日
必修/选修: 公选课
(一)实验要求
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
批阅:注意本次实验不算做实验总分,前三个实验每个实验10分,累计30分。本次实践算入综合实践,打分为25分。
评分标准:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分
(4)如果没有使用华为云服务(ECS或者MindSpore均可),本次实践扣10分。
注意:每个人的实验不能重复,课代表先统计大家做的内容并汇总,有重复的需要自行协商。
(二)实验过程及结果
1.导入库
2.制定一些空的list
3.向地址发送请求并用美味的汤解析返回的内容
4.针对每一个属性进行解析
5.在存储数据时对存储有影响的情况进行排查
6.把数据储存到csv里面
7.主函数
8.运行结果
(三)在华为云上运行代码
1.打开ESC服务器
2.连入putty
3.打开WinSCP并创建test
4.下载python3以及pip and更新
具体操作按照搭建微信公众号后台——收发文本消息_弹性云服务器 ECS_最佳实践_华为云 (huaweicloud.com)上的指示完成
5.运行成功结果
(四)在实验中遇到的问题
问题一:对于库的导入不清楚
解决:在文件中的setting里找到资源包上的搜索栏进行寻找
问题二:在putty运行时对python安装包,pip库导入不知道怎么弄
解决:在查找了n天资料后找到上述网址,按照流程就可以很简单的进行更新,不过库下载巨慢
问题三:python在putty上无法运行
解决:把py文件拖入在putty上下载的python文件夹就可以了(在SCP上操作)
(五)节课感悟
在本学期的python公选课中,我接触到了一个从来没有接触的领域(从入门到入土),上学期选到python的时候心情也是非常激动的,在这短短的十几节大课里,我感受到了python的魅力(尤其是这学期还有无情的c语言),王老师上课也是讲的非常有意思,尤其时对于markdown测评作业发奖品的时候显得整个人散发着光芒(yue)在课上,王老师对于每一个部分都讲的非常细致,不过下次可不可以讲的慢一点,每次都要跟着旁边的同学抄代码,菜鸟真的跟不上啊TAT,我对于python的爬虫感受是最深的,大家都是知道一句话“学python就要学爬虫”,其实我感觉生活中爬虫用的好绝对能给我带更多的1收获,虽然我现在只会爬一些比较简单的网站,但是以后我还是会加深python功夫,在python的道路上走到头秃.......阿不,走得越来越远qwq。
(以下是本次实验的python代码)
import requests #发送请求
from bs4 import BeautifulSoup #解析网页
import pandas as pd #存取csv
from time import sleep #等待时间(防止反爬)
book_name = [] # 书名
book_url = [] # 书籍链接
book_star = [] # 书籍评分
book_star_people = [] # 评分人数
book_author = [] # 书籍作者
book_translater = [] # 书籍译者
book_publisher = [] # 出版社
book_pub_year = [] # 出版日期
book_price = [] # 书籍价格
book_comment = [] # 一句话评价
def get_book_info(url, headers):
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
for book in soup.select('.item'):
name = book.select('.pl2 a')[0]['title'] # 书名
book_name.append(name)
bkurl = book.select('.pl2 a')[0]['href'] # 书籍链接
book_url.append(bkurl)
star = book.select('.rating_nums')[0].text # 书籍评分
book_star.append(star)
star_people = book.select('.pl')[1].text # 评分人数
star_people = star_people.strip().replace(' ', '').replace('人评价', '').replace('(\n', '').replace('\n)',
'') # 数据清洗
book_star_people.append(star_people)
# 没有一句话评价,比如倒数第二名,君主论
if book.select('.quote span'):
book_comment.append(book.select('.quote span')[0].text)
else:
book_comment.append(None)
info = book.select('.pl')[0].text.split('/')
if len(info) == 5: # 正常情况
book_author.append(info[0])
book_translater.append(info[1])
book_publisher.append(info[2])
book_pub_year.append(info[3])
book_price.append(str(info[4]))
elif len(info) == 4: # 没有译者,比如:第一名,红楼梦
book_author.append(info[0])
book_translater.append(None)
book_publisher.append(info[1])
book_pub_year.append(info[2])
book_price.append(str(info[3]))
elif len(info) == 6: # 有2个价格,比如:第一页,福尔摩斯探案全集(上中下)
book_author.append(info[0])
book_translater.append(info[1])
book_publisher.append(info[2])
book_pub_year.append(info[3])
book_price.append(str(info[4]) + '/' + str(info[5]))
elif len(info) == 3: # 没有作者,且没有译者,比如:第5页,十万个为什么
book_author.append(None)
book_translater.append(None)
book_publisher.append(info[0])
book_pub_year.append(info[1])
book_price.append(str(info[2]))
else:
pass
def save_to_csv(csv_name):
df = pd.DataFrame() # 初始化一个DataFrame对象
df['书名'] = book_name
df['豆瓣链接'] = book_url
df['作者'] = book_author
df['译者'] = book_translater
df['出版社'] = book_publisher
df['出版日期'] = book_pub_year
df['价格'] = book_price
df['评分'] = book_star
df['评分人数'] = book_star_people
df['一句话评价'] = book_comment
df.to_csv(csv_name, encoding='utf_8_sig') # 将数据保存到csv文件
if __name__ == "__main__":
# 定义一个请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
# 开始爬取豆瓣数据
for i in range(4): # 爬取共10页,每页25条数据
page_url = 'https://book.douban.com/top250?start={}'.format(str(i * 25))
print('开始爬取第{}页,地址是:{}'.format(str(i + 1), page_url))
get_book_info(page_url, headers)
sleep(1) # 等待1秒
# 保存到csv文件
save_to_csv(csv_name="BookDouban250.csv")