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


分享到:


相關文章: