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

2.3 處理URL數據

URL是Uniform Resoure Locator的縮寫,中文含義是統一資源定位器,也就是WWW網址。本節將詳細講解使用Python語言處理URL數據的知識。

2.3.1 使用urllib包

在Python程序中,可以使用urllib包處理URL請求。urllib包中主要包括如下所示的模塊。

● urllib.request:用于打開指定的URL網址。

● urllib.error:用于處理URL訪問異常。

● urllib.parse:用于解析指定的URL。

● urllib.robotparser:用于解析robots.txt文件。robots是Web網站跟爬蟲之間的協議,可以用txt格式的文本方式告訴對應爬蟲被允許的權限。

1.使用urllib.request模塊

在urllib.request模塊中定義了打開指定URL的方法和類,甚至可以實現身份驗證、URL重定向和Cookies存儲等功能。在下面的實例文件url.py中,演示了使用方法urlopen()在百度搜索關鍵詞中得到第一頁鏈接的過程。

源碼路徑:daima\2\2-3\url.py

在上述實例代碼中,使用方法urlencode()對搜索的關鍵字“www.toppr.net”進行URL編碼,在拼接到百度的網址后,使用urlopen()方法發出訪問請求并取得結果,最后通過將結果進行解碼和正則搜索與字符串處理后輸出。如果將程序中的注釋去除并把其后一句注釋掉,就可以在運行時自主輸入搜索的關鍵詞,執行效果如圖2-4所示。

圖2-4 執行效果

注意:urllib.response模塊是urllib使用的響應類,定義了與urllib.request模塊類似的接口、方法和類,包括read()和readline()。

2.使用urllib.parse模塊

在Python程序中,urllib.parse模塊提供了一些用于處理URL字符串的功能。這些功能主要是通過如下所示的方法實現。

(1)方法urlpasrse.urlparse()

方法urlparse()的功能是,將URL字符串拆分成前面描述的一些主要組件,其語法結構如下。

方法urlparse()將urlstr解析成一個6元組(prot_sch, net_loc, path, params, query, frag)。如果在urlstr中沒有提供默認的網絡協議或下載方案,defProtSch會指定一個默認的網絡協議。allowFrag用于標識一個URL是否允許使用片段。下面是一個給定URL經urlparse()后的輸出。

(2)方法urlparse.urlunparse()

方法urlunparse()的功能與方法urlpase()完全相反,能夠將經urlparse()處理的URL生成urltup 6元組(prot_sch, net_loc, path, params, query, frag),拼接成URL并返回。可以用如下所示的方式表示其等價性。

下面是使用urlunpase()的語法。

(3)方法urlparse.urljoin()

在處理多個相關URL時需要使用urljoin()的方法功能,例如在一個Web頁中可能會產生一系列頁面的URL。方法urljoin()的語法格式如下所示。

方法urljoin()能夠取得根域名,并將其根路徑(net_loc及其前面的完整路徑,但不包括末端文件)與newurl連接起來。例如下面的演示過程。

假設有一個身份驗證(登錄名和密碼)的Web站點,通過驗證的最簡單方法是在URL中使用登錄信息進行訪問,如http://username:passwd@www.python.org。但這種方法的問題是它不具有可編程性。但通過使用urllib可以很好地解決這個問題,假設合法的登錄信息是:

此時便可以通過下面的實例文件pa.py來實現使用urllib進行HTTP身份驗證的過程。

源碼路徑:daima\2\2-3\pa.py

①~②實現普通的初始化功能,設置合法的登錄驗證信息。

③~④定義函數handler_version(),添加驗證信息后建立一個URL開啟器,安裝該開啟器以便所有已打開的URL都能用到這些驗證信息。

⑤~⑥定義函數request_version()創建一個Request對象,并在HTTP請求中添加簡單的基于64編碼的驗證頭信息。在for循環里調用urlopen()時,該請求用來替換其中的URL字符串。

⑦~⑧分別打開給定的URL,通過驗證后會顯示服務器返回的HTML頁面的第一行(轉儲了其他行)。如果驗證信息無效會返回一個HTTP錯誤,并且不會有HTML。

2.3.2 使用庫furl處理數據

在Python應用中,庫furl是一個快速處理URL應用的小型Python庫,可以方便開發者以更加優雅的方式操作URL地址。可使用如下命令安裝furl。

在下面的實例文件url02.py中,演示了使用庫furl處理URL參數的過程。

源碼路徑:daima\2\2-3\url02.py

執行后會輸出:

2.3.3 使用庫purl處理數據

庫purl是一個簡單的、不可變的URL類,提供了簡潔的API來處理URL。在庫purl中,URL對象是不可變的,所有的修改器方法都會返回一個新的實例。我們可使用如下命令安裝purl。

在下面的實例文件purl01.py中,演示了使用庫purl處理三種構造類型URL的過程。

源碼路徑:daima\2\2-3\purl01.py

執行后會輸出:

在下面的實例文件purl02.py中,演示了使用庫purl返回各個URL對象值的過程。

源碼路徑:daima\2\2-3\purl02.py

執行后會輸出:

2.3.4 使用庫webargs處理數據

在Python程序中,可以使用庫webargs解析HTTP請求參數。庫webargs提供了當前主流的Web框架,如Flask、Django、Bottle、Tornado、Pyramid、Falcon等。可以使用如下命令安裝webargs。

在下面的實例文件webargs01.py中,演示了在Flask程序中使用庫webargs處理URL參數的過程。

源碼路徑:daima\2\2-3\webargs01.py

在瀏覽器中輸入“http://127.0.0.1:5000/?name='World'”后會顯示執行效果,如圖2-5所示。

圖2-5 執行效果

主站蜘蛛池模板: 莱阳市| 牟定县| 迭部县| 巴林左旗| 新野县| 宜章县| 宾阳县| 阳春市| 宁南县| 民和| 洛南县| 南澳县| 石楼县| 杂多县| 来宾市| 克东县| 连山| 绥芬河市| 花莲县| 南漳县| 呼图壁县| 桑植县| 温州市| 河池市| 滦南县| 石首市| 德钦县| 大洼县| 湖北省| 北辰区| 甘南县| 柏乡县| 高邑县| 青龙| 斗六市| 香河县| 林口县| 武平县| 连城县| 根河市| 基隆市|