探索Python爬虫的无限可能性:基础与应用
本文最后更新于:5 个月前
破冰
一些废话
🥣 这学期学校开设了 Python 课程,我索性把课堂作业啥的都放在这个栏目下了,那么这篇博客就用来记录日常的 Python 学习经验吧
🍝 这篇博客原标题是:
探索Python爬虫的无限可能性:基础与应用
介绍Python爬虫的进阶技术,包括动态页面爬取、数据解析、反爬虫策略等,并通过实战案例展示其实际应用
感觉这篇博文改名也没多大必要,不过还是把原标题放这留个纪念(2023/11/09晚)
正文
Python爬虫学习
一直以来都想学习爬虫技术, 却一直下不了决心, 不知道从何学起, 也没有精力去学
过年前后, 看过了黑马的Python基础课, 掌握了基本的语法, 现在伙伴匹配系统基础功能也完成了, 可以拿时间来系统且快速地学习Python爬虫了, 主要是我觉得一个Java程序猿怎么能不懂爬虫呢
爬虫的分类
1 |
|
Day1
今天是学习的第一天, 学习爬虫过程中也了解到了不少计网的知识, 这令我很惊喜了
简要总结一下学到些什么吧, 详细的知识点可以拿到老师的, 待会儿可以贴上来, 我就记重点了
requests, http/https协议, 爬虫, XML, XHR, AJAX, axios 这是我今天了解到的概念
爬取步骤
1 |
|
1 |
|
1 |
|
1 |
|
Day2
1 |
|
1 |
|
1 |
|
Day3
1 |
|
图表绘制
- 简单记录一下使用 Python 实现图表绘制 (2023/10/16晚)
中国版图
1 |
|
其他
折线图
1 |
|
饼图
1 |
|
柱状图
1 |
|
Python 期末小组作业(旧)
- 人工智能、Python课程的期末小组作业目前有想法,这俩门课程研究一个课题吧
课题名称
效果展示
- PPT,展示生成的图表
开发工具
- PyCharm
课题分析
生成图表三步骤:(2023/10/12早)
- 数据(构造数据,自行搜集资料构造数据)
- 数据样式选择(方便接下来导入数据,作数据分析)
- JSON 字符串,使用 Python 基础语法解构 JSON 字符串,获取数据
- Excel 图表,使用 Python 自带工具类,导入 Excel 图表,解构图表获取数据
- 数据样式选择(方便接下来导入数据,作数据分析)
- 导入数据:使用上述两种方式将数据导入完成后,智能分析,生成图表
- 智能分析
- 数据(构造数据,自行搜集资料构造数据)
代码讲解:
- 整体架构:上述三步骤
- 构造数据简单讲解(JSON 字符串样式)
- 列表、元组语法简单讲解
- 亮点(重点):如何解构 JSON 字符串/ Excel 图表获得数据
- 生成图表简单讲解
闲话
Python 期末小组作业(新)
实现思路
构思一下整个 Python 课设的实现思路:
实验目的
:掌握 Python 基础语法:函数定义与调用、条件分支、对象创建
掌握在 Python 中使用第三方库对 Excel 表格分析思路与具体实现
掌握使用 Python 实现数据库连接,并实现对数据基本的增、删、改、查操作 (2023/11/09晚)
功能实现
:- 数据存储:使用
Python
分析Excel
表格中的数据,存储到数据库中
- 连接本地数据库(如SQLite、MySQL等)。(2023/11/25早)
- 创建数据表,根据Excel表格的列名和数据类型定义表结构。
- 读取Excel表格中的数据,可以使用pandas库进行操作。
- 将读取到的数据插入到数据库中,可以使用pandas的to_sql方法。
- 数据更新:更新数据库中的数据记录
- 模拟请求,生成需要更新的数据记录。
- 使用Python连接到数据库,执行更新操作。
- 更新数据库中的数据记录,可以使用SQL语句或ORM框架(如SQLAlchemy)进行操作。
- 数据写回:从数据库中查询记录,生成统计图表展示数据,生成 Excel 表格,适当优化表格样式后,保存表格到本地
- 从数据库中查询记录,可以使用SQL语句或ORM框架进行查询。
- 对查询结果进行处理,例如计算统计指标、生成图表等。
- 将处理后的数据写入Excel表格,可以使用pandas的DataFrame对象进行操作。
- 适当优化表格样式,可以使用pandas的样式函数进行设置。
- 保存Excel表格到本地文件系统。
- 数据存储:使用
开发文档
图文并举,描述上述功能的具体实现
实现数据存储:连接本地数据库,新增数据实体,分析 Excel 表格数据,写入数据库
实现数据更新:模拟请求,更新数据库数据,掌握使用 Python 实现本地数据库的更新
实现数据写回:掌握如何在 Python 中实现数据库记录的查询(查询全表)
操作手册
- 连个可视化页面都没有,何谈操作手册?
- 主要是给开发者练手用的,本来就不是一个完整的应用
学习价值和应用场景
做这个大作业的好处有很多,以下是一些可能的学习价值和应用场景:
- 学习价值方面:
- 提高编程能力:通过完成这个大作业,你可以锻炼自己的编程技巧和解决问题的能力。你将学习如何设计和实现一个完整的应用程序,并处理各种挑战和错误。
- 加深对Python的理解:这个大作业将帮助你更深入地理解Python语言的各个方面,包括语法、数据类型、函数、类等。你将有机会应用这些知识来解决实际问题。
- 掌握数据处理和分析技能:通过使用Excel表格和数据库进行数据处理和分析,你将学习如何处理大量的数据,并进行统计和可视化展示。这对于数据分析和决策支持方面的工作非常有用。
- 培养团队合作能力:如果你选择与同学一起完成这个大作业,你将学会与他人合作、分工协作,共同解决问题。这有助于培养你的团队合作能力和沟通能力。
- 具体应用场景:
- 数据存储和管理:这个大作业可以帮助你学习如何使用Python连接数据库,并将数据存储到数据库中。这对于需要管理大量数据的应用程序非常有用,例如电子商务网站、社交媒体平台等。
- 数据分析和报告生成:通过使用Excel表格和数据库进行数据分析,你可以生成各种报告和图表,用于业务分析和决策支持。这对于企业、研究机构和政府部门都非常有用。
- 数据更新和维护:这个大作业可以帮助你学习如何使用Python更新数据库中的数据记录。这对于需要频繁更新和维护数据的应用程序非常重要,例如客户关系管理系统、库存管理系统等。
- 自动化数据处理流程:通过编写Python脚本来自动执行数据处理任务,你可以节省时间和精力,并提高工作效率。这对于需要处理大量重复性任务的工作非常有帮助,例如数据清洗、数据转换等。
- 总之,这个大作业不仅能够提升你的编程能力和数据处理技能,还能为你未来的学习和职业发展打下坚实的基础。无论是在学术研究、商业应用还是工程开发领域,掌握这些技能都将使你更具竞争力。
- 学习价值方面:
开发日志
2023/11/25
- 今天开始着手开发这个大作业了,,祝我一切顺利
- 简单回忆学习了下如何在不同包之间实现函数调用,感觉还是先实现功能吧,把框架搭好,按步骤一步一步慢慢实现(2023/11/25早)
2023/11/26
- 今早完成了数据库连接、查询数据库记录并用实体类接收、分析生成图表:
数据处理
Python 处理 Excel 表格
🔥 推荐阅读:
代码展示
- 今天中午第一次尝试使用 Python 处理 Excel 表格,找到了一段简短的实例代码: (2023/11/06晚)
1 |
|
- 直接运行,结果如下:
报错处理
- 本来直接安装下载缺失的第三方库后,直接运行代码就可以了,但是一直不生效(这个报错没截到图片)(2023/11/06晚)
1 |
|
1 |
|
它一直提示 “缺失第三方库 openpyxl”,但是我已经安装了
通过网络搜索、询问 AI 等方式,我先后尝试了多种方法,均无果:
- 查看
openpyxl
是否在当前环境中安装:
1
pip show openpyxl
- 展示已安装的 第三方库:
1
pip list
- 查看
我清楚这是编译器卡了的缘故,重启 Pycharm 也没效果
狗血的是,我在代码中显示引入了 openpyxl 库,结果就成功运行了(这段删了也没事,主要是右键编译器自动导入成功了)
1 |
|
- 看来我主动在终端安装下载第三方库不管用啊,还得显示导入 (2023/11/06晚)
openpyxl 处理数据 demo
- 示例代码如下:
实现了对 Excel 表格的读取、数据新增、删除、、修改等功能
1 |
|
- 注:操作对应 Excel 表时,确保文件未打开,否则会出现
无权限修改该文件
的报错:(2023/11/07午)
Python 连接数据库
- 作为 Python 大作业的一部分,今晚测试一下使用 Python 连接本地数据库的 demo 代码:
1 |
|
- 执行结果如下,成功执行 SQL,查询到数据库中的数据:(2023/11/15晚)
人脸识别
- 这个挺有意思的,记录一下(2023/11/25午)
1 |
|
开发个人工具包
- 上午突然冒出来的想法,原本打算随便操作数据库,作数据查询、插入、修改等,再使用第三方库做做可视化分析,生成个图表啥的
- 但是突然觉着太 low 了,最主要的还是没啥实际用途,权当巩固复习 Python 基础语法了
- 那我干脆一不做二不休,开发一个:个人工具包,包含日常学习办公常用的功能,目前的想法:(2023/11/27午)
功能还比较少,但是上述想法,目前基本都能实现,我快速了解了我需要学习的相关技术:
Python 程序 打包为 .exe 可执行文件:
使用 Python 进行简单界面开发:
有趣的小游戏:贪吃蛇、拥抱梅西、羊了个羊
先写这些吧,想法很多,也算是完成了我一直以来的心愿了,另外,这让我回忆起了尝试使用 Java 开发 MC 模组:
基本了解到了如何开发一个 MC mod 了,有机会试试 (2023/11/13午)
Python 程序打包为 .exe
- 安装
pyinstaller
:(2023/11/27早)
1 |
|
- 执行打包:
1 |
|
- 妈的,安装了半小时
pyinstaller
,修改了python
路径,咯噔了半天,又可以了:
- 打包成功!我们尝试执行一下:
- 在 dist 目录下找到可执行文件
.exe
,双击执行:
- 注意,我们只需要将 dist 目录下的文件压缩打包后,就可以发给好朋友使用了
Python 实现界面开发
Python 程序员过中秋Python+pygame 制作拼图中秋赏月小游戏(附源码:5源码) - 掘金 (juejin.cn)
- 详细的练习代码已经上传至 Gitee 了,最后照着示例,实现了一个简单的笔记本案例:
- 如下:
- 成功打包该笔记本软件,马上扔给好兄弟玩玩(2023/11/27晚)
1 |
|
新建窗口
- 点击按钮,新建窗口(2023/11/28午)
1 |
|
1 |
|
- 为
Button
按钮绑定了一个点击事件create_new_window
,创建了一个新窗口
一个用法震撼我两遍
- 注意到上面
Button
按钮绑定事件的方法没:
1 |
|
- 我们实现窗口上实时显示时间:
1 |
|
1 |
|
- 效果如下:
- 对于该函数用法的解释(文心一言):(2023/11/28午)
1
root.after(1000, update_time(label, root))
你在这里直接调用了
update_time(label, root)
,这样的话,update_time
函数会在主线程中立即执行,而不是在定时器触发后执行。因此,update_time
函数只会被调用一次,而不是每秒一次。正确的方法是将函数本身传递给
after
方法,而不是函数的执行结果。你可以使用一个lambda函数来解决这个问题,如下所示:
1
root.after(1000, lambda: update_time(label, root))
lambda: update_time(label, root)
是一个匿名函数,它会在指定的时间后执行
update_time(label, root),这样就可以保证
update_time`函数每秒被调用一次了。
点击执行一个可执行文件
- 为什么会有这样的想法呢?我打算开发一个小游戏模块,这个模块有哪些小游戏呢?展示一下目前的想法吧:
拼图游戏、黄金矿工、贪吃蛇、扫雷、羊了个羊
- 黄金矿工的话,之前用 Java 实现过,整体做工比较精良,我可不想再用 Python 写一遍
- 目前的想法就是在该工具包下内嵌一个黄金矿工小游戏,直接点击按钮就能执行(2023/11/28午)
1 |
|
英汉互译
- 简单的英汉互译测试:
1 |
|
- 成功实现英汉互译小程序,成功打包,发给好兄弟试试:(2023/11/28午)
开发者文档
这么新颖的项目,怎么能没有开发者文档呢?只是让用户使用一个个干煸的窗口怎么行?
正好最近在研究 Memory API接口开放平台的开发者文档的编写 + 部署,历时三天可算搞完了
Memory API接口开放平台、Vuepress 文档站点、Python 小程序,三个方向看起来八竿子打不到一块,今天让我融会贯通了:
Python 小程序提供的功能,也是Memory API接口开放平台所需要的,这极大地拓展了我对开放接口的想法
Memory API 接口开放平台需要一个开发者文档,用以详细介绍如何调用接口,包含接口信息、返回值、错误码等。那 Python小程序也很需要这些
VuePress 搭建文档站点并成功部署,这是很久以前的想法了,历时五个月,今天终于实现了
他奶奶的我可太兴奋了,待会儿就把这个过程记录下来(2023/11/28午)
那我们实现一个简单的网页跳转:
1 |
|
- 妈的,创建圆形按钮失败,
tkinter
不支持
讯飞星火 API接口开放平台
- 看下这篇文章就够了,也打包成功了,运行效果如下:(2023/11/28晚)
- 这样写的话,打包后运行 .exe 文件,窗口闪退了,尝试了一晚上还是没解决:
1 |
|
图片爬取
- 实现了一个简单的图片爬取软件,一键获取100+张图片!
1 |
|
- 妈的,好像被限制了还是咋的,本来打包就一直失败,现在本地都不能爬取了
天气预报
1 |
|
- 这里的
keyword_entry.get()
拿一个变量city
接收的话,会报 Null 的错误,所以不用参数接收,直接传参了 - 效果如下:(2023/12/01午)
封装方法为一个类
- 没错,面向对象编程的核心就是将具体功能封装到类中,这样能更好地组织和管理代码,同时也方便其他开发人员使用和共享这些功能。
- 这里以简易笔记本的实现为例,源代码:
1 |
|
- 封装后:
1 |
|
- 整个改造过程中,最重要的是把需要初始化的资源 / 变量都放在构造函数中完成,如下:
1 |
|
- 虽然之前学过 Python 基础语法,现在写还是有些生疏,慢慢习惯吧,还是很简单的(2023/12/04晚)
- 遗留下了问题:
如上,在主函数引入 MemoryNotepad 类,点击 “开始使用”后,直接跳出 “记事本” 窗口,明天再研究吧
继续(2023/12/08午)
怪了,明明写了有参构造器,new 一个对象还报错:
1 |
|
- 哦他奶奶的,
__init__
写成__int__
了
1 |
|
一个折磨人的BUG
- 就很简单的实现:按钮绑定函数,点击按钮,执行该函数(2023/12/08晚)
- 现在的问题很诡异,实例化一个对象,直接创建窗口;点击按钮,不触发生成窗口函数
- 看看这段奇怪的代码:
1 |
|
BUG 解决
- 整整一周过去了,这个烦人的 BUG 终于解决了
- 这其实是
tkinter
的渲染问题,在类MemoryNotepad
的__init__
函数中写如下代码:
1 |
|
- 在类
MemoryTools
的__init__
函数中写如下代码:
1 |
|
- 接着实例化一个
MemoryTools
对象,并调用create_window
方法:
1 |
|
- 可以看到,在
create_window
方法中,实例化了一个MemoryNotepad
对象,并执行生成了一个窗口 title
为MemoryTools
的窗口被被执行生成是很正确的,但是title
为MemoryNotepad
的窗口也被执行生成了:
- 这就非常奇怪了,明明没有显示地执行生成
title
为MemoryNotepad
的窗口,它却自动生成窗口了,这个机制很奇怪 - 引发了很棘手的问题:实现点击
button
按钮后,执行生成新窗口实现不了,因为实例化新窗口之后,就自动生成新窗口了 - 几经折腾,总算找到了解决的办法:
- 问题的根源在于我尝试在
__init__
函数中,初始化一个窗口对象window
,只要把window
的初始化,推迟到初始化函数中就行了,无需在__init__
中初始化,因为这个机制只会影响到__init__
内的window
窗口对象的生成 - 于是改写后的
MemoryNotepad
如下:
1 |
|
1 |
|
- 成功实现了点击
简易笔记本
按钮后,弹出窗口:
整合所有功能
- 整合 AI 对话模块时,出错了,由于
python
环境不同,同样的代码还运行不起来,改下MemoryTools
的python
环境变量即可:
- 改完记得要重启啊,不重启没效果的,运行成功:
- 终于把 AIChat 类改装好了,改装过程中,最需要注意的就是成员函数的参数形式了:
如果成员函数内部需要引用到成员变量,就把该成员函数的第一个参数指定为
self
1
2
3
4
5
6
7
8
9
10
11
def main(self, appid, api_key, api_secret, Spark_url, domain, question):
# print("星火:")
wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)
# websocket.enableTrace(False)
wsUrl = wsParam.create_url()
ws = websocket.WebSocketApp(wsUrl, on_message=self.on_message, on_error=self.on_error, on_close=self.on_close,
on_open=self.on_open)
ws.appid = appid
ws.question = question
ws.domain = domain
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})反之,就在成员函数定义上方添加这样的注解:
@staticmethod
1
2
3
4
5
6
7
8
@staticmethod
def getlength(text):
length = 0
for content in text:
temp = content["content"]
leng = len(temp)
length += leng
return length
开发者文档插入图片
- 上传至 Gitee 图床,在开发者文档中不显示,只好是放进文件夹中了,像这样:(2023/12/14晚)
1 |
|
窗口填充图片
- 在窗口中填充一张图片作为背景:
- 导入相关库:
1 |
|
- 准备图片,并确保导入路径正确:
1 |
|
- 然而这样是会报错的:
- 原因如下:
图片格式不受支持:
Tkinter
的PhotoImage
类只支持GIF
、PPM/PGM
格式的图片。对于JPEG
、PNG
等其他格式的图片,你需要使用PIL(Python Imaging Library)库
来进行处理。你可以尝试将你的JPEG
图片转换为GIF
或PPM/PGM 格式
,或者你可以使用PIL 库
来加载 JPEG 图片。
- 我们尝试使用
Image
、ImageTk
解决问题:
1 |
|
- 设置背景图片成功,需要注意设置原背景图的尺寸(2023/12/18早)
- 尝试改造
MemoryTools
的开始菜单页面: - 填充背景图片,并适当调整窗口大小和图片大小:(2023/12/18早)
1 |
|
- 添加一个标签组件
label
和一个按钮组件button
,调整它们的显示方式,使其自由浮动于该图片之上:
1 |
|
1 |
|
- 改造成功!效果如下:
- 上午我们实现了开始菜单页面的背景图填充,晚上我们继续完成工具栏页面的背景图填充:
项目打包后图片路径丢失
🍖 推荐阅读:
- 我在项目中引用了图片:(2023/12/20晚)
1 |
|
- 这里的图片路径很关键,如果是绝对路径,
pyinstaller
打包后,直接双击.exe文件会直接报错 - 我只好按图片路径,在打包完成后,手动添加图片资源路径:
点击按钮改变标签内容
- 点击按钮,实现改变指定标签
lable
的内容 - 这里实际的业务要求是标签根据文本框中的内容是否发生改变,记录此时的字符并绑定该值到标签
lable
上 - 这是之前的实现方式:
1 |
|
1 |
|
但是这里有个奇怪的问题:
label
标签加上textvariable
属性,在外部调用该label
所在函数,label
标签不显示我使用了新的方案解决这个问题:不使用
textvariable
属性,使用简单的text
属性解决这个问题:
1 |
|
1 |
|
1 |
|
- 不同的实现方法,完全一样的效果(2023/12/20晚)
日常报错
修改 pip 命令镜像源
Python 下载 / 引入包失败,改变镜像源可能会解决这个问题:(2023/10/18午)
windows环境pip设置国内源_pip国内源_t梧桐树t的博客-CSDN博客
有可能是网络原因,修改镜像源以保证 pip 得以正常引入包
1 |
|