官术网_书友最值得收藏!

現在來點兒完全不一樣的東西:例1-4展示的Python程序會執行一系列更復雜的任務。別指望現在就能看明白這段程序,否則我撰寫本書干嗎?!這個例子的目的是讓你感受一下一般的Python程序是什么樣子。如果你了解其他計算機語言,那么不妨和Python做一下對比。即使還不懂Python,也試試能否在閱讀程序后面的講解之前猜出每一行代碼都是干什么的。你已經見過Python列表和字典的例子,這個程序帶來了另外一些特性。

例1-4 archive.py

1 import webbrowser
2 import json
3 from urllib.request import urlopen
4
5 print("Let's find an old website.")
6 site = input("Type a website URL: ")
7 era = input("Type a year, month, and day, like 20150613: ")
8 url = "http://archive.org/wayback/available?url=%s&timestamp=%s" % (site, era)
9 response = urlopen(url)
10 contents = response.read()
11 text = contents.decode("utf-8")
12 data = json.loads(text)
13 try:
14     old_site = data["archived_snapshots"]["closest"]["url"]
15     print("Found this copy: ", old_site)
16     print("It should appear in your browser now.")
17     webbrowser.open(old_site)
18 except:
19     print("Sorry, no luck finding", site)

本書第1版中給出的樣例程序會連接YouTube網站,獲取當前評價最高的視頻信息,比如“Charlie Bit My Finger”。第2版剛完稿沒多久,谷歌便停止了這項服務,樣例程序也就沒法工作了。新的樣例程序1-4選擇了另一個網站,即位于Internet Archive(互聯網檔案館)中的Wayback Machine(時光機),這是一項免費服務,保存了20年多間數十億個Web頁面以及電影、電視節目、音樂、游戲和其他數字產品。第18章會展示更多Web API相關的例子。

該程序會要求你輸入一個URL和日期,然后查詢Wayback Machine是否保存了該站點當時的副本。如果能找到一個副本,就將信息返回給Python程序,由后者打印出URL并在Web瀏覽器中顯示。重點在于展示Python如何處理各種任務,即獲取你的輸入,與互聯網上的站點通信,獲取頁面內容,從中提取URL,以及讓Web瀏覽器顯示對應的頁面。

如果得到的是一個HTML格式的正常Web頁面,則需要想辦法將其顯示出來,這可不是一件輕松活兒,我們樂于讓Web瀏覽器代勞。另外還要嘗試提取所需的部分內容(詳見第18章的Web爬取)。不管做出哪種選擇,都意味著更多的工作和更大的程序。相反,Wayback Machine以JSON格式返回數據。JSON(JavaScript object notation,JavaScript對象記法)是一種人類可讀的文本格式,描述了其中數據的類型、值以及順序。它是另一種小語言,已經成為不同計算機語言和系統之間交換數據的流行方式。第12章會介紹更多關于JSON的內容。

Python程序可以將JSON文本轉換成Python 數據結構,在接下來的幾章中你會看到,這種數據結構和你自己創建出來的一樣。我們只選擇一小部分(舊網頁在Internet Archive網站中的URL)。同樣,這是一個完整的Python程序,你可以自己運行。為了讓這個例子簡短一些,我們在程序中僅加入了很少的錯誤檢查。行號不是程序的一部分,顯示它們只是為了幫助你閱讀程序后面給出的描述。

這個Python程序只有短短數行,但是干的活兒可不少。你現在可能還不知道下面這些術語是什么意思,不過在隨后幾章中就會明白了。每一行代碼的功能如下。

01.從Python 標準庫中導入模塊webbrowser(使其可供該程序使用)。

02.從Python標準庫中導入模塊json。

03.從Python標準庫中導入模塊urllib.request的urlopen 函數

04.空行,以免代碼看起來太擁擠。

05.打印出一些初始文本。

06.打印問題,詢問URL,讀取用戶輸入,將其保存在變量site中。

07.打印另一個問題,這次要讀取年、月和日,然后將其保存在變量era中。

08.構建字符串變量url,讓Wayback Machine查找指定站點當時的副本。

09.連接到URL的Web服務器,請求特定的Web服務

10.獲取響應數據并將其賦給變量contents。

11.將contents 解碼為JSON格式的字符串并賦給變量text。

12.將text轉換到data——Python數據結構。

13.錯誤檢查:嘗試運行接下來的4行代碼,如果出現任何錯誤,就執行程序最后一行(位于except之后)。

14.如果能找到站點當時的副本,就從3級Python 字典中提取URL。注意,該行和接下來的兩行是縮進的。Python由此知道這幾行代碼屬于try。

15.打印提取出的URL。

16.打印后幾行代碼執行后會出現什么結果。

17.在Web瀏覽器中顯示找到的頁面。

18.如果前4行出現任何錯誤,那么Python就直接跳轉到這里。

19.如果出現錯誤,就打印消息以及查找的站點。該行采用縮進形式,因為只有前一行的except執行之后才能執行這一行。

在終端窗口中運行這個程序,輸入網站URL和日期,得到下列文本輸出:

$ python archive.py
Let's find an old website.
Type a website URL: exampleurl
Type a year, month, and day, like 20150613: 20151022
Found this copy: http://web.archive.org/web/20151102055938/exampleurl
It should appear in your browser now.

圖1-3會出現在瀏覽器中。

圖1-3:來自Wayback Machine

例1-4用到了一些Python 標準庫模塊(Python自帶的程序),不過這并沒有什么神奇的。Python還擁有大量優秀的第三方軟件。例1-5使用外部Python軟件包requests進行了重寫。

例1-5 archive2.py

1 import webbrowser
2 import requests
3
4 print("Let's find an old website.")
5 site = input("Type a website URL: ")
6 era = input("Type a year, month, and day, like 20150613: ")
7 url = "http://archive.org/wayback/available?url=%s&timestamp=%s" % (site, era)
8 response = requests.get(url)
9 data = response.json()
10 try:
11     old_site = data["archived_snapshots"]["closest"]["url"]
12     print("Found this copy: ", old_site)
13     print("It should appear in your browser now.")
14     webbrowser.open(old_site)
15 except:
16     print("Sorry, no luck finding", site)

新版本更短小,對大多數人而言,可讀性應該更好。有關requests的更多細節,參見第18章,外部編寫的Python軟件參見第11章。

主站蜘蛛池模板: 高邮市| 阿合奇县| 沙洋县| 革吉县| 定远县| 旬邑县| 安多县| 卢氏县| 凭祥市| 泽州县| 庆安县| 阿拉善右旗| 车致| 高平市| 孟州市| 河津市| 广南县| 呼图壁县| 黑水县| 丹寨县| 宝清县| 湖口县| 霍林郭勒市| 宣城市| 长沙市| 平谷区| 平山县| 搜索| 武定县| 金塔县| 葵青区| 天祝| 南岸区| 驻马店市| 双流县| 凤台县| 武义县| 桐柏县| 革吉县| 扶绥县| 山丹县|