Python界最简单的“爬虫”-小白上楼梯0x05

在前面俺们安装了Anaconda3,并且在`PyCharm`中写出了程序界著名的`Hello World`。 具体过程请参照 。

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

Python界最简单的“爬虫”-小白上楼梯0x05

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

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

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

Python界最简单的“爬虫”-小白上楼梯0x05

右键新建Python文件

Python界最简单的“爬虫”-小白上楼梯0x05

文件名

### import语句与from import语句

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

<code>from urllib import request
import base64/<code>

看,写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__':`,最简单的理解是,直接运行当前文件的时候,才会被执行的语句。

<code>if __name__ == '__main__':/<code>

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

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

### 变量是个啥

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

<code>#为什么不直接定义字符串?不知道为什么,忽然间想桩哔
#为什么不直接定义字符串?不知道为什么,忽然间想桩哔
ooo = b'aHR0cHM6Ly9pbnB1dHRvb2xzLmdvb2dsZS5jb20vcmVxdWVzdD9pdGM9emgtdC1pMC13dWJpLTE5\\n' \\
b'ODYmbnVtPTEzJmNwPTAmY3M9MSZpZT11dGYtOCZvZT11dGYtOCZhcHA9ZGVtb3BhZ2UmdGV4dD0=\\n'/<code>

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

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

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

### 调用函数

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

<code>resp = request.urlopen(base_url+bianma)
html = str(resp.read(), 'utf-8')
print(html)/<code>

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

完整的代码如下:

<code>01  from urllib import request
02 import base64
03
04 if __name__ == '__main__':
05 # 为什么不直接定义字符串?不知道为什么,忽然间想桩哔
06 ooo = b'aHR0cHM6Ly9pbnB1dHRvb2xzLmdvb2dsZS5jb20vcmVxdWVzdD9pdGM9emgtdC1pMC13dWJpLTE5\\n' \\
b'ODYmbnVtPTEzJmNwPTAmY3M9MSZpZT11dGYtOCZvZT11dGYtOCZhcHA9ZGVtb3BhZ2UmdGV4dD0=\\n'
08 base_url = str(base64.decodebytes(ooo), 'utf-8')
09 bianma = 'wqvb'
10 resp = request.urlopen(base_url+bianma)
11 html = str(resp.read(), 'utf-8')
12 print(html)
13
14 bianma = 'anlw'
15 resp = request.urlopen(base_url+bianma)
16 html = str(resp.read(), 'utf-8')
17 print(html)/<code>

运行之后,效果如下:


Python界最简单的“爬虫”-小白上楼梯0x05

运行效果

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

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

53482225320


分享到:


相關文章: