在前面俺们安装了Anaconda3,并且在PyCharm中写出了程序界著名的Hello World。 具体过程请参照安装Anaconda3详细记录-小白上楼梯0x04

这一系列文章的目标是,零基础,纯手工,实现一款五笔输入法。至于为什么是五笔,而不是拼音,因为五笔的编码少呀,只用简单的[a-yyyy]就能囊括所有,更加简单方便。

而拼音的音节比较多,再分开到每一个字母上面的话,数量比较可观,再说了,大厂的拼音输入法都加持了云,还有各种非常方便好用的各种功能扩展,还有贴心的各种小窗提醒等等,它不香嘛它。

这篇的最后,我们说好使用Python来实现请求wqvb(你好)anlw(世界)

在开始之前,我们得知道Python与Javascript之间的一些共通的特性。它们俩都是解释型语言,Python代码开始被Python虚拟机(PVM)执行之前,会先编译成字节码的形式保存,以.pyc文件保存。然后再将pyc文件转发到PVM中执行。接下来,我们使用PyCharm,在前面新建的HelloWorld项目中,新增一个名叫get_ciku.py的Python文件,来取到wqvbanlw返回的数据。

import语句与from import语句

第1、2行,使用from xxx import从指定的包将需要的模块导入,供我们使用:

1
2
from urllib import request
import base64

看,写Python代码不用在一行结束的时候写;,并且有很好可读性,这一行代码一看它的意思就是从urllib导入request

有人说from import 像是在告诉PVM,从玩具箱找个奥特曼给我(form urllib import request)。

import是,把玩具箱给我(import urllib)。

两种方式的区别在于当你拿到玩具箱的时候,每一次要用奥特曼的时候,得先拿起玩具箱,找出奥特曼。

也就是说要使用request调用方法的时候,得这样写:urllib.request.xxx()

而从一开始就拿到奥特曼的情况下,调用方法时就直接写request.xxx()

关于if __name__ == '__main__':

第4行,if __name__ == '__main__':,最简单的理解是,直接运行当前文件的时候,才会被执行的语句。

1
if __name__ == '__main__':

1, 首先是一个if语句,用来表示判断,意思是:如果什么是真(如果什么与什么相等),就做什么。做什么的语句需要使用缩进来让PVM知道这些语句是if判断的一部分。可以看到,Python的if语句没有使用{}来表示一个块区域,而是使用缩进,这大概也提高对于人类的可读性吧。

2, 那么if __name__ == '__main__':就是在判断__name__ 的值是不是”main“,如果是,就执行if语句后面缩进的部分。而变量名__name__是Python内置的一个变量,表示当前模块的名字(get_ciku),当直接运行一个模块的时候,PVM会在运行的时候把__name__的值设置成__main__,所以,利用这个特性,这一个语句,常被用来做一个模块的测试用例,或者一个脚本的程序入口。

变量是个啥

第6、8行,定义了名为ooobase_url的两个变量用来存放爬取词库时使用的地址中通用、不会改变的部分。

1
2
3
4
#为什么不直接定义字符串?不知道为什么,忽然间想桩哔
ooo = b'aHR0cHM6Ly9pbnB1dHRvb2xzLmdvb2dsZS5jb20vcmVxdWVzdD9pdGM9emgtdC1pMC13dWJpLTE5\n' \
b'ODYmbnVtPTEzJmNwPTAmY3M9MSZpZT11dGYtOCZvZT11dGYtOCZhcHA9ZGVtb3BhZ2UmdGV4dD0=\n'
base_url = str(base64.decodebytes(ooo), 'utf-8')

可以看到,对ooo进行base64解码之后,再使用utf-8的编码方式定义为字符串。然后将这个字符串赋值给base_url。

至于变量为何物这个问题,我自己的理解是,假如b'aHR0cHM6Ly9pbnB1dHRvb2xzLmdvb2dsZS5jb20vcmVxdWVzdD9pdGM9emgtdC1pMC13dWJpLTE5\n'他们是一群朴实的人,每个字母或者数字代表一个人,每个人都有自己本身的名字与能力(比如a,它的名字叫a,能力是会飞)。要去城里打工。这么一群人,一起出现,就成了一串(字符串)。而这一串人,组合起来,架桥很牛(字符串的意义)。有一天,有个老板,需要这一串人去修一座很宏伟的桥,要用这一串人。聪明的老板在动员大会上,进行了一次全员点名之后,就规定这一串人,叫做修桥大队。这个时候,这位老板提出的这个修桥大队就是变量名了,用来代表刚才这一串人。而其实,他每次都会把新招到的可以修桥的一组人,都会叫做修桥大队(变量的值发生改变)。

变量其实就是一个代号。表示一组数据,而不用来回都拿着一组数据本身去使用。

调用函数

第10行,调用request模块中的urlopen函数,并将拼接好的地址做为参数传入urlopen函数。

1
2
3
resp = request.urlopen(base_url+bianma)
html = str(resp.read(), 'utf-8')
print(html)

可以看到,python使用.方法名(参数1[,参数2])这样的格式,来调用一个模块或者对象的函数。

完整的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from urllib import request
import base64

if __name__ == '__main__':
# 为什么不直接定义字符串?不知道为什么,忽然间想桩哔
ooo = b'aHR0cHM6Ly9pbnB1dHRvb2xzLmdvb2dsZS5jb20vcmVxdWVzdD9pdGM9emgtdC1pMC13dWJpLTE5\n' \
b'ODYmbnVtPTEzJmNwPTAmY3M9MSZpZT11dGYtOCZvZT11dGYtOCZhcHA9ZGVtb3BhZ2UmdGV4dD0=\n'
base_url = str(base64.decodebytes(ooo), 'utf-8')
bianma = 'wqvb'
resp = request.urlopen(base_url+bianma)
html = str(resp.read(), 'utf-8')
print(html)

bianma = 'anlw'
resp = request.urlopen(base_url+bianma)
html = str(resp.read(), 'utf-8')
print(html)

运行之后,效果如下:

1
2
3
4
5
C:\Users\portal8\Anaconda3\python.exe C:/Users/portal8/PycharmProjects/get_gowubi/get_ciku.py
["SUCCESS",[["wqvb",["你好","您好"],[],{"candidate_type":[0,0]}]]]
["SUCCESS",[["anlw",["世界"],[],{"candidate_type":[0]}]]]

Process finished with exit code 0

可能细心的你已经发现,在9-12,14-17两组代码段中,只有bianma变量的值是不一样的,而其它的3句是完全相同的。客官可以思考一下,在这种存在大量重复代码的时候,要怎样做才能使自己的代码简单、高效。

啊~好瞌睡。今天就先这些,晚安。

53482225320

最后更新: 2020年03月25日 23:15

原始链接: https://nimeiz.gitee.io/notes/use-python-get-a-record/

× 愿我的文字带给你阳光
打赏二维码