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.导入库

Python程序设计 课程思政立项申报书 python课程设计要求_python

 

 2.制定一些空的list

Python程序设计 课程思政立项申报书 python课程设计要求_Windows_02

 

 3.向地址发送请求并用美味的汤解析返回的内容

Python程序设计 课程思政立项申报书 python课程设计要求_Python_03

 

 4.针对每一个属性进行解析

Python程序设计 课程思政立项申报书 python课程设计要求_Python_04

 

 5.在存储数据时对存储有影响的情况进行排查

Python程序设计 课程思政立项申报书 python课程设计要求_Windows_05

 

 

Python程序设计 课程思政立项申报书 python课程设计要求_python_06

 

 6.把数据储存到csv里面

Python程序设计 课程思政立项申报书 python课程设计要求_Windows_07

 

7.主函数

 

8.运行结果

 

Python程序设计 课程思政立项申报书 python课程设计要求_Windows_08

Python程序设计 课程思政立项申报书 python课程设计要求_python_09

 

 

Python程序设计 课程思政立项申报书 python课程设计要求_python_10

 

 

Python程序设计 课程思政立项申报书 python课程设计要求_Python_11

 

(三)在华为云上运行代码

 1.打开ESC服务器

Python程序设计 课程思政立项申报书 python课程设计要求_Windows_12

 

 2.连入putty

Python程序设计 课程思政立项申报书 python课程设计要求_Python_13

 

 3.打开WinSCP并创建test

Python程序设计 课程思政立项申报书 python课程设计要求_python_14

 4.下载python3以及pip and更新

具体操作按照搭建微信公众号后台——收发文本消息_弹性云服务器 ECS_最佳实践_华为云 (huaweicloud.com)上的指示完成

5.运行成功结果

Python程序设计 课程思政立项申报书 python课程设计要求_Windows_15

 

 (四)在实验中遇到的问题

问题一:对于库的导入不清楚

解决:在文件中的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")