20222119《Python程序设计》实验四报告

千燁~ 2023-05-25 23:39:27

课程:《Python程序设计》
班级:2221
姓名: 夏永烨
学号:20222119
实验教师:王志强
实验日期:2023年5月21日
必修/选修: 公选课

1.实验内容**
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
本次结课大作业选择了编写爬虫的方向,用python程序实现从豆瓣电影网上爬取电影排行前100电影,这次是用了网络上的代码并且结合自己的更改来进行一个程序的爬取。

** 2. 实验过程及结果**
(1)首先是实验的准备工作

img

这是我爬虫过程中需要用到的一些库,我这个爬虫程序的书写必须需要这些库的支撑。
(2)正则表达式的书写
为什么要书写正则表达式?答:正则表达式,是用来我们筛选信息的。
下面是书写的所有正则表达式:

img

正则表达式的书写要结合网站本身,具体操作如下图:

img

img

img

以上是在检查过程中网页的元素,其中第一个图中有电影详情链接,有电影标题,第三张图中有图片链接,我们可以通过这样的方式找到内容对应的元素,然后据此书写正则表达式筛选出我们需要的信息。其他我们需要的信息我们也可以通过同样的方法去寻找到,那么我们怎么才能找到信息对应的元素呢。
第二张图这是我找寻元素的过程,这个元素你通过鼠标的滑动你可以找到元素对应的信息,即信息与元素之间是有一个一一对应的关系的,我通过右侧的检查就可以找到我想要的元素了,这样我们就可以找到我们书写正则表达式需要的元素了。
(3)建立存储方式

img

这里是我的爬取网页的函数,baserul是我爬取网页的链接,我通过这个链接来爬取我想要的,下面获取信息,新建XLS的这些操作都是通过我数据库中的函数实现的,我只需要调用即可。
(4)向网页发起请求

img

这个askURL就是用来向网页发送请求用的,head在这里起到的作用就是伪装,我在这里装成一个浏览器,如果我要是不写的话,访问网站的时候会被认出来爬虫,显示错误,错误代码。
html=response那一行就是我们读取网页的内容,设置编码为utf-8,目的就是为了防止乱码。
(5)逐一解析数据

img

img

解析数据这里我们用到了 BeautifulSoup这个库,这个库是几乎是做爬虫必备的库,无论你是什么写法。下面就开始查找符合我们要求的数据,用BeautifulSoup的方法以及 re 库的正则表达式去匹配,正则表达式怎么匹配,如何去匹配我已经在上面讲过了,这里我就不再赘叙了。
匹配到符合我们要求的数据,然后存进 dataList , 所以 dataList 里就存放着我们需要的数据了。
(6)保存数据

img

保存数据可以选择保存到 xls 表, 需要(xlwt库支持)也可以选择保存数据到 sqlite数据库, 需要(sqlite3库支持)
保存到 xls 的主体方法是 saveData (上面的saveData方法是保存到sqlite数据库):

img

创建工作表,创列(会在当前目录下创建)然后把 dataList里的数据一条条存进去就行。
最后运作成功后,会在左侧生成这么一个文件

img

img

img

表格的开头和结尾就如图所示,这样我的一个爬虫就成功了。

将代码提交到gitee

img

** 3. 实验过程中遇到的问题和解决过程**

  • 问题1:正则表达式的书写
  • 问题1解决方案:这个正则表达式的书写方式是在网上查找的,当时并没有具体结合到一个这样的豆瓣网站,所以我为了让这个能够具体结合到豆瓣网站,我就在网上查找正则表达式是如何运用到爬虫里面去的,然后通过检查更改了一下我的这个程序,最后完成了这个正则表达式的书写
  • 问题2:如何爬取一百个豆瓣电影的评分
  • 问题2解决方案:你知道的,豆瓣电影评分上面一页只有25个电影,那么需要查找四页的豆瓣电影,那么我就通过可以通过一个循环的方式,循环获取四页的信息,这样就可以了。

4.全课总结
Python选修课自一开始的学习思路与c语言便有所不同,c语言是面向过程的语言,而python这门语言这是一个面向对象的语言。Python给我的感觉有种不切实际的简单,简单是因为python不用书写许多程序的过程,用起来特别简单,而为什么不切实际呢,这是因为python接触的很多都是高大上的,就算你能直接用函数库,其书写也并不比c简单多少,甚至在书写方面上会更复杂,如果打个比喻,python程序书写有一个高屋建瓴的感觉。我们在一开始简单熟悉了循环语句、条件语句等语言基础,还有学会了debug和后,又接触到了处理列表、元组、集合和字典这些较新的概念,学习了正则表达式的书写,还有python中函数及参数传递的方法。面向对象的三大基本特征分别是封装、继承、多态,在其中我们学会了如何去创建类和属性;我们还学习了如何导入模块,怎样进行异常处理和文件操作,通过实验三还初步掌握了socket通讯的技能。总而言之,python的学习十分紧凑,内容丰富,但很显然这并不是python学习的尽头,python还有许多需要去学习的,这就需要我们在接下来的学习中继续努力。
5.结课感想与建议
Python其实是我一直向往学习的一门语言。进入大学后就一直听说python这门语言,而且很多最前沿的东西都是用python写的,所以当大一下学期可以选python的时候,我就不假思索地选择了python这门课,开始了我正统地学习python。
  这学期的课程其实正如王老师所讲的那样,只是初步地将我们领进了门,之后的造化还得靠我们自己。Python它实现的多元性注定让我有着很多很多的地方可以更加深入的学习,这门课我相信也应该会成为我学习Python的启蒙课,这学期的时间让我对这门语言越来越感兴趣,在课余时间,我还通过我自己的学习学习了一些有关深度学习的内容,深入了解了一下卷积层和卷积运算,更深入的了解了一些python的前沿东西,我还学长一起通过网上的代码完成了一个暴力检测的小制作,那次制作让我更深的认识了python的应用扩展,原来python的技术可以这么强大,这更加激发了我对python课程的兴趣,所以我在暑假中打算自己自学更多的python内容。还是那句话,师傅领进门,修行在个人,python的学习还是要我们自己更多的努力。
  王老师讲课真的很有意思!!!以兴趣为导向的Python课我也真的好喜欢!!以后其实可以考虑更多讲一些python的趣味应用,我觉得应该更能激发大家的兴趣的!!不过就是课程内容安排有时有点太紧,比如那个数据库,一次晚课就讲完了,真的太快了。还有就是python课程安排我认为是不太得当的,一周一次,如果中间没有自己的复习,很容易导致课程的遗忘,如果python可以一周上两次课就好了,这样学习python就可以更加深刻了!还有,python课程还是需要布置作业,作业能够有效帮我们复习知识,我们自己肯定是不想做作业的,但是不得不承认,作业确实对我们学习大有裨益,希望老师能够下届学生布置一些作业。
  希望以后还能有机会选到王老师的课~
代码及视频

# -*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  # 网页解析,获取数据
import re  # 正则表达式,进行文字匹配`
import urllib.request, urllib.error  # 制定URL,获取网页数据
import xlwt  # 进行excel操作
#import sqlite3  # 进行SQLite数据库操作

findLink = re.compile(r'<a href="(.*?)">')  # 创建正则表达式对象,标售规则   影片详情链接的规则
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
findTitle = re.compile(r'<span class="title">(.*)</span>')
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findJudge = re.compile(r'<span>(\d*)人评价</span>')
findInq = re.compile(r'<span class="inq">(.*)</span>')
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)




def main():
    baseurl = "https://movie.douban.com/top250?start="  #要爬取的网页链接
    # 1.爬取网页
    datalist = getData(baseurl)
    savepath = "豆瓣电影Top250.xls"    #当前目录新建XLS,存储进去
    # dbpath = "movie.db"              #当前目录新建数据库,存储进去
    # 3.保存数据
    saveData(datalist,savepath)      #2种存储方式可以只选择一种
    # saveData2DB(datalist,dbpath)



# 爬取网页
def getData(baseurl):
    datalist = []  #用来存储爬取的网页信息
    for i in range(0, 10):  # 调用获取页面信息的函数,10次
        url = baseurl + str(i * 25)
        html = askURL(url)  # 保存获取到的网页源码
        # 2.逐一解析数据
        soup = BeautifulSoup(html, "html.parser")
        for item in soup.find_all('div', class_="item"):  # 查找符合要求的字符串
            data = []  # 保存一部电影所有信息
            item = str(item)
            link = re.findall(findLink, item)[0]  # 通过正则表达式查找
            data.append(link)
            imgSrc = re.findall(findImgSrc, item)[0]
            data.append(imgSrc)
            titles = re.findall(findTitle, item)
            if (len(titles) == 2):
                ctitle = titles[0]
                data.append(ctitle)
                otitle = titles[1].replace("/", "")  #消除转义字符
                data.append(otitle)
            else:
                data.append(titles[0])
                data.append(' ')
            rating = re.findall(findRating, item)[0]
            data.append(rating)
            judgeNum = re.findall(findJudge, item)[0]
            data.append(judgeNum)
            inq = re.findall(findInq, item)
            if len(inq) != 0:
                inq = inq[0].replace("。", "")
                data.append(inq)
            else:
                data.append(" ")
            bd = re.findall(findBd, item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?', "", bd)
            bd = re.sub('/', "", bd)
            data.append(bd.strip())
            datalist.append(data)

    return datalist


# 得到指定一个URL的网页内容
def askURL(url):
    head = {  # 模拟浏览器头部信息,向豆瓣服务器发送消息
        "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
    }
    # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)

    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html


# 保存数据到表格
def saveData(datalist,savepath):
    print("save.......")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表
    col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
    for i in range(0,8):
        sheet.write(0,i,col[i])  #列名
    for i in range(0,250):
        # print("第%d条" %(i+1))       #输出语句,用来测试
        data = datalist[i]
        for j in range(0,8):
            sheet.write(i+1,j,data[j])  #数据
    book.save(savepath) #保存

# def saveData2DB(datalist,dbpath):
#     init_db(dbpath)
#     conn = sqlite3.connect(dbpath)
#     cur = conn.cursor()
#     for data in datalist:
#             for index in range(len(data)):
#                 if index == 4 or index == 5:
#                     continue
#                 data[index] = '"'+data[index]+'"'
#             sql = '''
#                     insert into movie250(
#                     info_link,pic_link,cname,ename,score,rated,instroduction,info)
#                     values (%s)'''%",".join(data)
#             # print(sql)     #输出查询语句,用来测试
#             cur.execute(sql)
#             conn.commit()
#     cur.close
#     conn.close()


# def init_db(dbpath):
#     sql = '''
#         create table movie250(
#         id integer  primary  key autoincrement,
#         info_link text,
#         pic_link text,
#         cname varchar,
#         ename varchar ,
#         score numeric,
#         rated numeric,
#         instroduction text,
#         info text
#         )
#
#
#     '''  #创建数据表
#     conn = sqlite3.connect(dbpath)
#     cursor = conn.cursor()
#     cursor.execute(sql)
#     conn.commit()
#     conn.close()

# 保存数据到数据库
if __name__ == "__main__":  # 当程序执行时
    # 调用函数
     main()
    # init_db("movietest.db")
     print("爬取完毕!")



...全文
594 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文介绍了基于低秩逼近代理模型的N-1安全约束经济调度快速计算方法,并提供了完整的Matlab代码实现。该方法针对电力系统中N-1故障场景下的安全约束经济调度(SCED)问题,提出采用低秩逼近技术构建高效代理模型,有效降低高维优化问题的计算维度与复杂度,显著提升多场景下调度方案的求解效率。文中系统阐述了数学建模过程、代理模型构造原理、低秩近似算法推导及其实现流程,特别适用于含高比例可再生能源接入、存在大量不确定性因素的现代电力系统优化调度,能够在保障计算精度的同时满足实时性与准实时性应用需求。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员和工程技术人员,尤其适合从事电力系统经济调度、安全稳定分析、不确定性建模与高性能计算等相关领域的专业人士。; 使用场景及目标:①应用于大规模电力系统在N-1故障条件下的快速安全校核与经济调度决策支持;②为高渗透率新能源接入的电力系统提供高效的多场景优化求解方案;③支撑日前调度、实时调度等对计算速度与精度均有较高要求的工程应用场景。; 阅读建议:读者应结合所提供的Matlab代码深入理解算法实现细节,建议在标准测试系统上复现并调试程序,以掌握低秩逼近方法在电力系统优化中的具体应用技巧,并可根据实际研究方向进行模型拓展、性能对比与算法改进。
内容概要:本文档聚焦于电力系统黑启动与负荷恢复的研究,结合Matlab代码实现,系统探讨了电力系统在发生大面积停电事故后的恢复策略。研究内容涵盖了黑启动过程中的关键环节,如发电机组的启动顺序、恢复路径规划、负荷逐步投入等,并通过Matlab仿真对恢复流程进行建模与验证,旨在优化恢复时序与资源配置。文档还关联了智能优化算法、机器学习、路径规划、电力系统故障分析与调度优化等多种技术方向,展现了其在科研与工程实践中的广泛应用前景。配套代码和资料可通过提供的网盘链接下载,便于读者复现与拓展研究。; 适合人群:具备电力系统基本理论知识和Matlab编程能力的研究生、高校科研人员及从事电力系统运行、调度与控制相关工作的工程技术与研究人员。; 使用场景及目标:①用于电力系统恢复策略的教学演示与科研仿真分析;②支撑黑启动方案的设计、评估与优化决策;③为复杂电网故障后快速恢复供电提供算法模型与技术参考; 阅读建议:建议读者结合网盘中的完整代码资源,按照文档所述技术路线逐步实践,重点关注黑启动过程中机组启动逻辑与负荷恢复的协调机制,并可进一步拓展至多能源协同恢复、智能算法优化等前沿研究方向。
源码直接下载地址: https://pan.quark.cn/s/1eceaa56687c Chrome 开发者工具中文手册 =============== Chrome DevTools 是公认的优秀的前端调试工具,由于功能强大,所以使用起来有一定的学习门槛,与此同时 Chrome DevTools 暂时没有中文手册,对于不太熟悉英文的同学会比较吃力。 本项目的初衷是为想使用或者正在使用 Chrome DevTools 的同学提供一个中文手册,方便大家学习使用这个优秀的工具,提高前端开发效率和质量! 翻译流程 第一阶段 先将 Chrome DevTools 的内容按现有的目录结构翻译成中文,其中: 文章正文内容均放在 目录下,采用 格式。 文章中所用到的图片资源暂时先用现有英文手册的原始链接,后续图片资源会统一托管到七牛云存储 文件命名规则 文件名为 Chrome DevTools 对应文章超链接中 后的部分。 所有的空格和 用 代替。 例如: 这篇文档,对应 这个文件。 对于下级子页面文档,将其放在以父级文档名称命名的文件夹下面。 例如: 属于 那么将放置在 。 第二阶段 根据翻译文档,制作成类似在线手册或者与官方文档类似的网站,方便大家参阅。 参与项目 欢迎你参与翻译本项目,在翻译的过程中,可以锻炼你的英语能力和 Chrome DevTools 的实际应用能力,同时还为他人提供方便,何乐而不为? 一个个 commit 堆积起来就是一个了不起的 repo,欢迎你 Fork 并提交 Pull Request 或者 Issue ,哪怕是改正一个错别字、修正一个病句,我们都会很高兴。 参与方法和步骤如下: 登录 https://.com Fork 创建您的特性分支 (gi...

144

社区成员

发帖
与我相关
我的任务
社区描述
开展Python教学和技术交流
python 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧