第8章
���������财务报告自然语言处理——
���������Python中文大数据分词与可视化
上市公司财报PDF文件中的数据是典型的非结构化数据,区别于财务报表那种结构化数据,
这种非结构化数据往往更加重要,本章首先讲解如何实现PDF文件文本解析,并通过对上
市公司的年报(经营报告)PDF文件解析来巩固相关知识点,掌握了PDF文件解析后,本
章还将讲解如何对文本数据进行大数据分词与可视化。
”
目�录
• PDF文件文本解析
• 中文大数据分词
• 案例实战——绘制上市公司风
险提示词云图
•PDF文件文本解析
��PDF文件文本解析基础——提取文本与表格
想要深入对PDF文件正文内容进行分析,就需要用到PDF文件文本解析技术。Python中有多
个可以用于解析PDF文件文本的库,如pdfplumber库、pdfminer库、tabula库等,经编者测试,
pdfplumber库是目前使用比较方便的库,而且pdfplumber库不仅可以用于解析文字,还可以用于
方便地解析PDF文件中的表格。
(1)pdfplumber库的安装
这里推荐使用pip安装法安装pdfplumber库:按Win + R快捷键调出运行框,输入cmd后单击“
确定”按钮,在弹出的窗口里输入pip install pdfplumber后按Enter键,等待安装结束即可。
如果一直安装不成功,可以使用清华镜像pip安装法,代码如下:
或者用下面的写法,效果是一样的。
操作如图8-1所示。
图8-1
��PDF文件文本解析基础——提取文本与表格
(2)用pdfplumber库提取文本内容
pdfplumber库的使用方法非常简单,通过pdfplumber库的extract_text()方法就可以解析PDF
文件第一页的文本内容了,代码如下:
��PDF文件文本解析基础——提取文本与表格
其中通过open()方法打开文件,这里用的是相对路径,即代码所在文件夹,如果需要可
以改成绝对路径。之后通过pages属性获取所有页的信息,此时获取的pages是一个列表。
然后通过pages[0]提取第一页的信息并利用extract_text()方法获取文本内容,最后将内容输
出并关闭的PDF文件。运行效果如图8-2所示。
图8-2
��PDF文件文本解析基础——提取文本与表格
如果想解析每一页的内容,那么通过for循环语句即可实现,代码如下:
其中有一个小技巧就是先创建一个空列表text_all,然后通过列表名.append()方法将
每一页的文本内容存储到列表中,最后通过'连接符'.join(列表名)的方法将列表转换成字
符串。在商业实战中,通常就只需要更改第2行的文件名称。
��PDF文件文本解析基础——提取文本与表格
或者通过如下代码实现。
��PDF文件文本解析基础——提取文本与表格
(3)用pdfplumber库提取表格内容
除了可以解析普通文本内容外,pdfplumber库还可以解析文档中的表格,在演示文档“
公司A理财公告.PDF”第4页有图8-3所示的表格内容。
图8-3
��PDF文件文本解析基础——提取文本与表格
通过pdfplumber库的extract_tables()方法就可以提取页面中的表格,代码如下:
��PDF文件文本解析基础——提取文本与表格
注意通过extract_tables()返回的tables是该页的全部表格,它是一个列表。因为第4页只
有一张表格,所以可以通过tables[0]来提取第一张也是唯一的表格,运行效果如图8-4所示。
图8-4
��PDF文件文本解析基础——提取文本与表格
此时获得的table是一个嵌套列表结构,大列表里包含多个小列表,每个小列表的内容即
表格中每一行的内容,可以通过第4章讲过的pandas库使得最终的展现效果更加好看一些,
代码如下,其中table[0]即表头信息,table[1:]为第2行及其以下的内容。
获得的表格df如图8-5所示。
图8-5
��PDF文件文本解析基础——提取文本与表格
此时获得的表格存在一些换行符\n,这是因为在原表格中部分字符之间是存在换行的,
如果想把这些换行符去掉,可以采用replace()函数将换行符替换掉,代码如下:
��PDF文件文本解析基础——提取文本与表格
之前讲过获得的table是一个嵌套列表结构,所以需要通过两层循环来定位具体的文本内容,
其中table[i]表示的是子列表,table[i][j]表示的是子列表中的元素。然后通过replace()函数替换
换行符,注意这里还需要将替换后的内容重新赋值给table[i][j]才能真正完成替换,此时通过
df = (table[1:], columns=table[0])可以获得图8-6所示表格,换行符已经被替换掉
了。
图8-6
��PDF文件文本解析基础——提取文本与表格
这里再补充一个知识点,在有的编译器中,比如PyCharm中,展示DataFrame的
时候可能只展示一部分列而不展示全部列,如图8-7所示。
图8-7
这里可以在查看df前多写如下一行代码解决该问题。
��PDF文件文本解析基础——提取文本与表格
输出效果如图8-8所示。
图8-8
完整代码如下所示。
��PDF文件文本解析实战——上市公司年报PDF文件解析
了解了如何进行PDF文件文本解析之后,下面就来讲解如何解析上市公司的年度报告PDF
(简称年报PDF)文件,上市公司的年报PDF文件里通常包含很多有价值的内容,本章更关心其
中的非结构化数据,也就是一些文字性描述内容,包括年报中的核心竞争力披露、公司的未来
发展展望等。
(1)解析单个上市公司年报中的核心竞争力披露
首先关注的是公司在年报中披露的有关核心竞争力的信息,这部分信息是上市公司与其他公
司有显著区别的内容,因此是值得关注的重点内容。
要解析该部分内容,需要先定位这部分内容的位置,不妨随便打开一份年报,如图8-9所示。
图8-9
��PDF文件文本解析实战——上市公司年报PDF文件解析
贵州茅台核心竞争力分析部分,在整篇年报中位于第三节“公司业务概要”的
最后,如何把它提取出来呢?
��PDF文件文本解析实战——上市公司年报PDF文件解析
首先利用pdfplumber库把贵州茅台年报PDF文件中的文本解析为字符串,操作
方法在前文已经详细介绍过了,这里不赘述
��PDF文件文本解析实战——上市公司年报PDF文件解析
接下来的提取工作其实也很简单,主要用到了re库。
首先需要确定的是,要提取的内容的前面是以“核心竞争力分析”几个字开头,之后就是第四节
的内容(前文提到过此内容在第三节的最后一部分),所以第2行代码就用这个匹配规则把想要的内
容提取出来了。
但是此时得到的是一个列表结果,要先取第一个元素,即结果字符串。
接下来需要做一些数据的清洗工作,比如把'\n'和'2020 年年度报告'这种夹杂在结果字符串中的字符
去掉(此处不存在翻页,所以不存在‘2020 年年度报告’这样的字符,在实际操作中,若存在翻页
则用相应代码进行删除),这里用的是replace()方法,也可以用re库自带的sub()方法。
最后,用strip()方法去掉前后的空格,就初步得到了一个核心竞争力信息字符串,如图8-10所示。
图8-10
��PDF文件文本解析实战——上市公司年报PDF文件解析
(2)解析单个上市公司年报中的未来发展展望
类似地,公司年报中上市公司关于自己未来发展的展望部分也有较高的信息
价值,同样也是关注重点,下面把这部分解析出来,先观察这部分内容在年报
中的位置,如图8-11所示。
图8-11
以上是贵州茅台2020年报中未来发展展望的大体位置,与核心竞争力披露的解析过程相似,首先也是
解析该PDF文件
��PDF文件文本解析实战——上市公司年报PDF文件解析
然后根据前后文的特点提取该部分内容
��PDF文件文本解析实战——上市公司年报PDF文件解析
可以看到,这里的代码与上一部分的不同在于第3行代码取了结果列表中的第二个元素,
这是为什么呢?这是因为在年报中符合第2行正则表达式匹配规则的内容有两个,其中第
一个是详细版目录中出现的,而真正想要的是第二个元素,所以这里是res[1],最后可以
获得图8-12所示结果。
图8-12
��PDF文件文本解析实战——上市公司年报PDF文件解析
(3)批量解析多个上市公司年报中的未来发展展望
现在已经掌握了单家公司未来发展展望的解析方法,那么如果我们想一次性解析多家公
司年报的对应内容(比如白酒行业某一年的所有公司的年报),这是否可行呢?
首先来看另一份年报,如图8-13所示。
图8-13
��PDF文件文本解析基础——提取文本与表格
这是五粮液2020年年报的相应内容,可以看到,与贵州茅台年报不同的是,五粮液年报中公司未来
发展展望部分的标题是“公司未来发展的展望”,而非“公司关于公司未来发展的讨论与分析”,那
么在这种情况下,如果还用前文的方法去提取,肯定是无法得到相应结果的。
这其实是上市公司年报结构化规范较低导致的,虽然现在证监会已经对上市公司年报披露的时间、
方式以及哪些内容必须披露都做出了相对规范、统一的规定,但是在上市公司年报的一些非数据信息
的披露上,尤其是这些非结构化的文本信息的披露上,可以说基本没有统一的要求,虽然大部分公司
都会披露相应的内容,但是披露的方式、标题等都有一定差异,这就为我们的解析工作带来了一些困
难,那么如何克服这一困难呢?我们可以增加匹配规则的数量,以增加匹配成功的概率。
��PDF文件文本解析基础——提取文本与表格
经过编者的仔细观察和一一比对,白酒行业各公司进行相应信息披露的内容格式和位置逃
不出这4种组合方式,即两种开始方式和两种结束方式的组合,只要找到这两种开始方式和
结束方式,再用(.*?)把它们拼接起来,就能比较全面地包括所有情况了,最后把它们都放
进一个列表中待用。
接下来进行解析。
��PDF文件文本解析基础——提取文本与表格
由于是批量处理多份PDF文件,所以还需要借助os库,利用listdir()方法获取目标文件夹“白酒行业
年报”下的所有文件,并遍历得到的结果列表(注意,利用listdir()方法得到的结果的第三个元素为文
件名列表)。
首先,用replace()方法获取公司名称,后续保存时会用到。
然后进行PDF文件的解析,这一流程我们已经相当熟悉了(第14行也可以选择不输出),接下来对
得到的text_all进行正则匹配。
��PDF文件文本解析基础——提取文本与表格
因为需要一个个尝试匹配规则,所以对于创建好的匹配规则列表进行遍历,正则提取之后
做一个if判断,只要得到的结果为空(返回结果长度为0),就继续尝试下一个匹配规则;否
则视为找到结果,跳出循环。
第1行代码的意思是有可能遇到前文一样的目录重复问题,所以只取结果列表的最后一个
元素作为最终结果。
第2行代码用于设置保存文件夹名称(需要提前建好)。
第3行代码用于创建一个新的TXT文件,以该公司名称命名,并写入字符串。
最后就得到了图8-14所示的文件夹。
图8-14
��PDF文件文本解析基础——提取文本与表格
每份文件的内容与图8-15所示的类似。
图8-15
�中文大数据分词
中文分词(Chinese word segmentation)指的是将一个
汉字序列切分成一个个单独的词,我们知道,在英文的
行文中,单词之间是以空格作为分界符的,而中文的词
语则没有一个形式上的分界符,因此在分词这一层面,
中文比英文要复杂一些。
��中文大数据分词技巧�
(1)jieba库的安装
在进行文本大数据分词前需要先安装一个中文分词库jieba库,可以通过pip安装法来安装,以
Windows系统为例:按Win + R快捷键调出运行框,输入cmd后单击“确定”按钮,然后在弹出的
窗口中输入pip install jieba后按Enter键来进行安装,如果安装失败可以尝试使用清华镜像pip安装法。
安装完jieba库之后就可以利用它进行分词操作了。首先来看一个简单案例,然后进行更深入的
讲解,示例代码如下。
其中第1行代码用于引入jieba库;第2行代码通过cut()函数对里面的文本内容进行分词,将分词
后的结果赋给变量word;第3和4行代码通过for循环输出分词后的结果,结果如下所示。
中文分词的核心就是利用jieba库的cut()函数来进行分词,上面的案例较为简单,下面以一
个较长的文本内容来进行中文分词及词频统计。
��中文大数据分词技巧
(2)读取文本内容并进行分词
图8-16所示为2017年信托行业年度报告,共有约20万字,对于业务分析人员来说,他其实关心的
是这约20万字的报告中哪些内容更重要,一个简单实现手段就是看哪些词出现的频率最高,那么其
对应内容的重要程度可能就越高,如果要实现这么一个功能,就需要先进行中文大数据分词然后进
行词频统计。
图8-16
��中文大数据分词技巧
对该TXT文件中的文本内容进行分词的代码如下:
第1行代码用于引入jieba库;第2行代码通过open()函数打开TXT文件,参数'r'表示以读取方
式打开TXT文件,并通过read()函数读取其中的文本内容;第3行代码通过cut()函数对读取到的
文本进行分词操作。
注意这里得到的words并不是一个列表,而是一个迭代器,迭代器其实和列表很相似,为方
便理解,可以把它理解成一个“隐身的列表”。想要获取迭代器里的元素,不能够直接通过
print(words)来获取结果,而需要通过for循环来查看迭代器里的元素,如下所示。
��中文大数据分词技巧
运行代码,结果如图8-17所示。
图8-17
这样就能把分完的词一一输出了,但现实生活中我们可能只需要其中的3字词汇或
者4字词汇,那么这时候就需要用到下面的处理手段了。到这里,其实分词这一关键
步骤已经做完了,下面就是把结果更好地呈现出来了。
��中文大数据分词技巧
(3)提取分词后的4字词
有的时候我们并不关心所有长度的词汇,因为有的两字词汇虽然出现的频率高,但其实可能没
有什么特别的含义。这里以提取大于等于4个字的词汇为例讲解如何按特定的要求来获取词汇,
代码如下:
��中文大数据分词技巧
首先创建一个report_words列表,然后遍历words中的每一个元素,如果该词汇的长度大于等
于4则把它放到report_words列表中并输出,结果如图8-18所示。
图8-18
可以看到里面有的词重复出现了很多次,比如图8-18中圈出来的“信托公司”。这个
report_words列表还可以再深度挖掘,比如希望能够统计出这个列表里的高频词汇,那么就
需要用到后文的小技巧了。感兴趣的读者也可以将代码中的数字4改成3或者2,看看短词的
提取效果。
��词频统计技巧
统计词频相对而言并不复杂,需要用到一个小技巧,引入collections库中的Counter()函数就
可以统计列表中每个词语的频次了,代码如下。
这样便可以输出每个词出现的频次,如果想看出现频次最多的前50名,那么可以利用most_common
()函数来获取高频词及其出现的次数,代码如下:
输出result就可以看到运行效果,如图8-19所示。
图8-19
��词频统计技巧
可以看到里面的一些高频词还是能体现整个信托行业的情况的,比如最近几年的信托行业年度
报告里便频繁提到信息技术与人工智能这类词,那这可能是行业未来发展的一个趋势。
完整代码如下:
��绘制词云图
在进行词云图绘制前需要先安装wordcloud库,可以通过pip安装法来安装,以Windows系统为例:
按Win + R快捷键调出运行框,输入cmd后单击“确定”按钮,然后在弹出的窗口中输入pip install
wordcloud并按Enter键来进行安装,如果安装失败可以尝试采用清华镜像pip安装法。
(1)初步绘制词云图
在小节已经获取到了分词后的结果report_words,其中获取的都是4字以上的词语,也可以将代
码中的数字4改成自定义的数字。在绘制词云图前,先引入相关的库。
引入相关的库后,就可以通过如下代码绘制词云图了。
��绘制词云图
第1行代码通过小节提到的join()函数(用法:'连接符'.join(列表名)),将列表转换为字符
串,并通过一个空格连接列表中的元素,这样处理后的内容才符合词云图生成函数的数据要求。
第2~6行代码通过WordCloud()函数生成词云图,其中也可以把括号里的内容写为一行,这里
为了方便阅读,每行写一个参数。其中simhei是黑体的意思,计算机默认都有该字体,
则是黑体字体文件。设置完参数后,便可以通过generate()函数生成词云图。
第7行代码通过to_file()函数将图片导出,这里使用的是相对路径,即代码所在文件夹,结果
如图8-20所示。
图8-20
��绘制词云图
(2)绘制特定形状的词云图
图8-20所示的图片不是特别好看,这里来讲解如何生成特定形状的词云图,首先引入相关的库。
PIL库是专门处理图片的库,如果计算机没有这个库,安装命令为:pip install pillow。NumPy库
是用来处理数据的库,如果安装的是Anaconda,则默认已经安装好了这个库。
引入相关库后,就可以绘制指定形状的词云图了,代码如下:
��绘制词云图
第1行代码用于导入需要绘制的形状图片,例如这里要绘制的形状就是微博的Logo,这里就传
入“微博.jpg”,这里采用的是相对路径,即代码所在文件夹下的图片。
第2行代码通过PIL库的Image库打开图片。
第3行代码通过()将图片转换为数组格式,其实就是将图片每一个像素的RGB值生成一
个多维数组,感兴趣的读者可以将其输出,结果如下,其中“255 255 255”就是白色的RGB值。这
3行代码了解即可,本质就是将图片转换为数组格式,实际操作过程中直接使用就行。
第10行代码用于设置mask形状参数,传入的就是第3行代码转换为数组格式的maskImages。
最终结果如图8-21所示,此时已经有了微博Logo的形状,不过颜色还是默认的颜色。
��词频统计技巧
图8-21
��绘制词云图
(3)绘制特定形状与特定颜色的词云图
这一部分讲解如何在生成特定形状的基础上,再设置特定颜色,首先引入相关的库。
其中第1行代码从wordcloud库中再额外引入ImageColorGenerator库,用来获取颜色;第2行
代码用于引入imageio库的imread库,用来读取图像,如果没有该库可以用pip安装法安装。
引入相关库后,就可以绘制指定颜色的词云图了,在之前代码的最下面加上如下代码。
第1行代码通过imread()函数读取图片,其中blackgroud_pic就是前文的“微博.jpg”;
第2行代码通过ImageColorGenerator()函数获取图片颜色;第3行代码通过recolor()函数
给图片设置指定颜色,最终导出的图片如图8-22所示,可以看到除了形状外,也加上
了微博Logo的特定颜色。
��词频统计技巧
图8-22
��词频统计技巧
完整代码如下。
��词频统计技巧
�案例实战——绘制上市公司风险提示词云图
这一节将讲解如何对上市公司年报里与风险提示
相关的内容绘制词云图。
��绘制单家上市公司词云图
首先以贵州茅台2019年年报的风险提示段为例,介绍如何绘制单个上市公司的词云图。
�案例实战——绘制上市公司风险提示词云图
首先还是打开对应文件夹(源代码文件中已经包含,读者可以直接用)下的文件,
并利用jieba库进行分词。
�案例实战——绘制上市公司风险提示词云图
然后是筛选出特定长度的词语,由于风险提示段本来就短,如果在这里词语长度设得太长,最
终结果可能会很少,所以把除了单个字的词语都纳入考虑范围。
�案例实战——绘制上市公司风险提示词云图
下面开始绘制词云图。首先是设置好词云图的形状(该文件夹也帮读者下载好了,都是各公司
对应的企业Logo),然后按照前文介绍的()方法打开该图片,并转换为数组形式的图片
遮罩层。
��词频统计技巧
接下来将分好的词用空格连接起来,并设置词云图的各项参数。
接下来为了体现出所选词云图背景的颜色,需要先读取图片(路径已经设置好),然后获取
该图片的颜色信息,最后给词云图重新设置颜色。
��词频统计技巧
最后别忘了保存。得到的结果如图8-23所示。
图8-23
虽然风险段比较短,得出的词不是很多,导致词云图填充效果不是很好,但还是可以依稀
看出贵州茅台Logo的轮廓。可以从中清晰地看到风险段中重点提到的几个词,即压力、环境、
宏观经济等,比文本信息更直观。
��批量绘制多家上市公司词云图
下面希望实现的是为多家上市公司的风险段文本批量生成词云图。主要技术难点就是os库和for
循环的恰当运用。在开始遍历之前,先新建一个存放词云图结果的文件夹,然后用os库的listdir()
方法获取风险段文件夹下所有文件的名字。
接下来开始遍历,这里需要重点注意文件名的写法,要小心后缀问题。
词云形状的文件名也要注意,由于此时文件扩展名为.jpg,所以要先把原name变量的后缀去
掉,还要注意文本文件名称与图片名称的区别,除了后缀,还有2019,也要去掉。
最后保存时也要注意文件命名问题。
��批量绘制多家上市公司词云图
打开词云图结果文件夹,效果如图8-24所示。
图8-24
��批量绘制多家上市公司词云图
其中山西汾酒的结果较好,如图8-25所示。
图8-25
本章介绍了对于PDF文件的解析方法,其中包括提取文字、提取表格、中文大数据分词
以及词云图可视化等相关知识点,掌握了这些知识便可以进行财报PDF文件的自动解析、
大数据分词以及可视化分析了。
课后习题
��批量绘制多家上市公司词云图
��批量绘制多家上市公司词云图
��图像识别
(2)直接定位中心点
locateCenterOnScreen()方法相当于结合了locateOnScreen()和center()方法的功能,可以直
接返回一个中心点的Point类实例。
��图像识别
(3)加速图像定位
①�限定区域。
本书所用的定位方法,是从屏幕的左上角开始找图像,从左至右遍历,然后从上到
下遍历,一旦找到就停止。可以想象的是,这样做的成本是高昂的,可能需要一秒或
更长的时间来进行定位。
加速这一过程的良好方法是使用region参数为图像定位限定一个大致区域,区域越
小,匹配就越快。
4个值分别对应x、y、w、h,分别指左上角的x轴、y轴坐标,以及宽度(width)
和高度(height)。
��图像识别
下面通过实验来对比匹配速度。
��图像识别
可以看到,加速效果十分明显。
②�灰度匹配。
还可以通过将参数grayscale设置为True,来为� locate()函数加速,根据官方文档,加速比例在
30%左右。这是牺牲准确率换取速度的做法,会降低图像和屏幕截图的颜色饱和度加快定位速度,
但可能会导致误匹配。
��图像识别
(4)降低查找精度
PyAutoGUI库对图像匹配的要求较高,有时可能因为图像的放大、缩小造成了像素上
的差异,导致匹配失败。可以通过设置confidence参数来降低查找精度,从而更方便地
使用图像定位功能。
要使用confidence参数,首先要安装OpenCV,打开命令行窗口,用pip命令安装即可。
成功安装后,即可根据实际情况,将confidence设为小于1的数。
��截图及像素颜色获取
(1)像素颜色获取
可以用pixel(x,y)函数来获取(x,y)点的像素颜色,返回对象是一个三元组,分别对应RGB值的
(red,green,blue)。
还可以用 pixelMatchesColor(x,y,(red,green,blue)) 验证某一像素是否为某颜色,颜色仍然用
RGB值来表示,返回值为True或False。
��截图及像素颜色获取
(2)截图功能
可以用screenshot()函数来获取当前屏幕截图,返回对象是一个Image类实例。
运行这段代码,输出如图7-11所示。
图7-11
可以将该截图保存到自定义路径中。
��截图及像素颜色获取
由于使用的是相对路径,运行后,会在代码文件同路径下生成截图文件,这里也可以
换成绝对路径,结果如图7-12所示。
图7-12
��截图及像素颜色获取
打开该截图文件,就可以看到运行时桌面的截图,如图7-13所示。
图7-13
��截图及像素颜色获取
还可以用region=(左,上,宽,高)来自定义截图范围。
打开新的截图文件,如图7-14所示。
图7-14
��截图及像素颜色获取
可以用getpixel()来查看截图某一像素的RGB值。
��截图及像素颜色获取
简单应用示例
用前文讲过的基本方法实现模拟登录百度查询python的功能。先初始化PyAutoGUI库的
一系列参数,并启动自动防故障功能。
获取浏览器网址输入框的坐标,如图7-15所示。
图7-15
��截图及像素颜色获取
输入网址,代码如下(注意其中的坐标位置需要根据显示器大小调节)。
获取到百度搜索界面输入框的坐标,如图7-16所示。
图7-16
��截图及像素颜色获取
输入搜索内容,开始搜索。
正确出现搜索结果,如图7-17所示。
图7-17
到这里,就完成了对于PyAutoGUI库基础和进阶知识的讲解,节将通过综合案例实战来
演示如何通过这个库实现自动定时下载网银流水。
�综合案例实战——自动定时下载网银流水
在做财务相关的工作时,时常需要批量、定时地进行网银流水的下载。各
银行下载网银流水的方式有所不同,且许多银行都使用了自主开发的程序,
没有提供相关接口。在这一案例实战中,我们选取一个简单的网银模拟程序,
基于PyAutoGUI库完成对网银流水的定时下载。
��模拟程序介绍
因为实际的网银程序登录要求比较严格,例如通常需要一些类
似网银盾的辅助设备,不利于学习和练习,所以编者使用PyQT5库,
写了一个简单的网银模拟程序,方便模拟网银流水下载的
全流程,在本章源代码文件夹的main文件夹中,双击其中的
应用程序,可以进入网银模拟程序,如图7-18所示。
该程序功能较为简单,首先,用户打开程序,输入账号、密码
进行登录,登录后,出现网银流水界面,展示了当前网银流水信息,
可以通过单击“导出”按钮进行导出,并可以选择要保存到的路径。
导出成功后,程序会给出提示。
��思路分析
下载一次网银流水,需要依次做到:双击程序—输入账号、密
码—单击登录—单击导出—在弹出的窗口中找到地址输入栏—粘贴
想要保存到的路径—关闭程序。
本例采取坐标定位来完成这一流程,先手动完成一次导出,用
截图或之前提到的PyAutoGUI库自带的输出坐标方法记录各个点的
坐标,再加入定时,就可以完成定时自动下载网银流水的任务。
��具体代码实现
首先,根据程序所在坐标,双击以打开程序(注意本节涉及的坐标位置需要根据显示器大小调节)。
��具体代码实现
接下来粘贴账号及密码,并单击登录,仍然用之前的操作剪贴板的方式来粘贴。
账号、密码也可以仿照之前的案例实战从Excel文件中读取。可以在每步后暂停,防
止程序执行过快导致一些步骤被跳过。
��具体代码实现
正确输入账号、密码,如图7-19所示。
登录成功后,进入下一界面,如图7-20所示。
���
����������������图7-19 �������������������������������� ����������������图7-20
��具体代码实现
单击“导出”按钮,根据记录好的坐标,在地址栏中粘贴想要保存网银流水的路径,
并选定文件夹。
��具体代码实现
成功保存后,先关闭提示框,最后关闭程序。
选择保存文件夹,如图7-21所示。
图7-21
��具体代码实现
导出成功的提示如图7-22所示。
图7-22
��具体代码实现
最后,将其封装为函数。
��具体代码实现
��具体代码实现
如果想使程序定时执行,可以使用schedule库,schedule库的相关知识点可以参考小
节补充知识点:通过schedule库实现定时任务。最终代码汇总如下:
��具体代码实现
��补充知识点:通过schedule库实现定时任务
有时需要在原有段落中新增文字,这时需要对之前添加段落的代码进行修改,代码如下:
这和单独写_paragraph('我喜欢你')的结果是一样的,不过它的意义不太一样,
之前讲过_paragraph('我喜欢你')生成的是一个段落,那么“我喜欢你”4个字虽
短,却也是个段落,如果要在这个段落里再添加内容,比如在“你”字后面再加“的眼
”,通过add_paragraph()方法只能新建一个段落,就没有办法在“你”字后面增加内容
了。比如执行如下代码:
��补充知识点:通过schedule库实现定时任务
想要准确地实现每天的定时任务,可以使用Python的schedule库,schedule的中文
翻译是时刻表。首先需要安装schedule库,其安装办法推荐使用pip安装法:按
Win+R快捷键调出运行框,输入cmd后单击“确定”按钮,在弹出的对话框内输入
pip install schedule后按Enter键安装。
使用schedule库的方法并不复杂,只需要和一个定义好的函数相配合即可,下面
以每天中午12点输出“该吃饭啦”为例演示schedule库的用法,代码如下:
��补充知识点:通过schedule库实现定时任务
首先引入schedule和time库,然后定义一个函数,函数名为eatting,该函数没有设置
参数,函数内容为输出“该吃饭啦”。然后通过如下核心代码告诉程序每天中午12:00
执行eatting()这个函数。
��补充知识点:通过schedule库实现定时任务
at后的括号里是具体的时间,do后的括号里是需要执行的函数。
定义了执行时间和要执行的函数后,还需要通过while True来让程序一直运行,_pending
()的含义为运行所有可以运行的schedule任务,(10)是让schedule任务运行完休息
10秒再检测是否有可以运行的任务,这里也可以直接写成(1)。在上述代码中,当
到了每天12:00的时候,就会检测到可执行的schedule任务(运行eatting()函数),并执行该
schedule任务。
除每天定时执行任务外,schedule还可以执行别的定时任务,比如每隔10分钟执行一次
任务、每隔一个小时执行一次任务、每周在一定时间执行任务等。示例代码如下。
��补充知识点:通过schedule库实现定时任务
如果函数里还有参数,那么可以将参数写到do后面的括号里的函数名称后面,代码如下。
课后习题
THANK�YOU