當前位置:
首頁 > 最新 > python漸進-訪問網路文件

python漸進-訪問網路文件

python有一些現成的類可以供網路文件的讀取。比如urllib,urllib2以及httplib都可以。

urllib在網路文件讀取方面功能較少,無法修改http頭,無法設置timeout,也無法進行proxy認證。urllib類裡面可以使用的是對url字元串的處理函數,比如說生成url字元串,對url串的字元進行轉義處理等等。

urllib2提供的功能比較強大,除了支持http以及https協議的訪問之外,還提供修改http頭,設置超時時間,以及proxy認證,基本認證等功能,提供自動獲取重定向網頁的功能,自動處理cookies的功能。

httplib可以提供http協議的文件訪問,但是需要對http協議熟悉才能夠處理好。

所以這裡主要介紹urllib2的使用。

17.1 獲取網路文件

urllib2使用urlopen()方法來獲取一個網路文件。urlopen的常用參數有三個,一個是url字元串或者是一個Request對象;第二個是data參數,如果使用了data參數,那麼urlopen將用post方法來提交這個請求;第三個是timeout參數,是超時參數。

Request對象可以自定義網路請求的參數,如果需要修改http頭,那麼就必須要是用Request對象來請求。Request對象的常用參數也有三個,一個是url字元串;第二個是data參數,如果request對象設置了data參數,那麼之後的urlopen方法就不需要設置data參數了;header參數是一個字典,用來修改http的請求頭。

現在很多的網站伺服器經常會根據http頭的User-Agent域來判斷請求的瀏覽器,根據Referer域來判斷從哪個頁面過來的請求。如果發現這兩個域的值和預期不一致,那麼這個請求就有可能被屏蔽掉,因此想要通過python代碼來訪問網頁,通常都得對http頭進行修改。這些域都可以通過chrome瀏覽器的開發者工具進行抓包查看。一個常用的模擬瀏覽器進行網頁抓取的http頭字典可能是下面這個樣子的。

httpheaders=dict()httpheaders["Connection"]="keep-alive"httpheaders["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"httpheaders["Accept"]="*/*"httpheaders["Accept-Language"]="zh-CN,zh;q=0.8"

設置好了http頭之後,進行網路文件訪問了,一個完整的代碼可能如下。

這段代碼定義了一個url字元串,這裡一定要使用http://頭,因為urllib2還支持ftp協議以及文件的獲取。

然後實例化一個Request對象,使用之前定義的http頭。

接著使用urlopen方法獲取這個網路文件,超市時間為15秒。

這段代碼需要放到try...except...語句當中,這樣才可以捕捉到各種網路錯誤。

使用了urlopen獲取到文件之後,就可以使用f.read()方法進行文件內容的讀取;

使用f.info()方法獲取到返回的http頭;

使用f.getcode()方法獲取到http的返回碼;

使用f.geturl()來獲取到重定向的url。

這些操作完成了再使用f.close()來關閉這個網路文件的句柄。

常用的返回http頭可以是讀取伺服器返回的cookies,或者是網頁的類型和字元編碼

f.info()["Set-Cookie"]f.info()["Content-Type"]

以上Set-Cookie是伺服器返回的cookies,而Content-Type則包含了網頁類型和字元編碼。

如果在請求網路文件的時候帶上cookie,那麼可以在http頭字典中添加cookie域。可以和上面一樣直接設置httpheaders這個dict,也可以通過Request的add_header方法來設置。比如說。

其中第一項為header的域Cookie,而第二項為值。

17.2 使用代理

使用代理可以在一定程度上避免ip被封殺的情況。如果使用的代理是免密的,那麼可以在urllib2的opener中添加一個ProxyHandler,示例代碼為

proxy_handler = urllib2.ProxyHandler({"http": "http://121.31.103.172:8123"})opener = urllib2.build_opener(proxy_handler)urllib2.install_opener(opener)

以上代碼實例化了一個ProxyHandler的對象,這個對象可為http協議提供代理,代理的地址帶著http://頭以及代理的ip地址和埠。接著把這個handler包裝成一個opener並且把它安裝成默認的打開器。

接下來訪問網頁文件的代碼和前面的一樣了。

如果代理是帶域名和密碼的,那麼就需要再添加一個ProxyBasicAuthHandler了。示例代碼為

proxy_handler = urllib2.ProxyHandler({"http": "http://121.31.103.172:8123"})proxy_auth_handler = urllib2.ProxyBasicAuthHandler()proxy_auth_handler.add_password("realm", "host", "username", "password")opener = urllib2.build_opener(proxy_handler,proxy_auth_handler)urllib2.install_opener(opener)

接下來的訪問網頁文件的代碼也和前面一樣。

17.3 使用urllib處理url字元串

url的字元只能夠是ascii字元,有一些字元比如說+ 空格 ?等等在url字元串中有另外的含義。比如說+號表示的是空格,/分隔目錄,?分隔url和參數,%跟特殊字元,#表示書籤,&是參數分隔,=是參數賦值。這些符號如果直接出現在url中,就不會表示它的字面意思。

如果想要它們表示其字面意思,就需要進行轉義,變成%hh格式的字元串。其中h是一個十六進位的數。而hh就是這個字元的ascii序號。這樣就把一個字元拆成三個字元來表示了。

使用quote()方法可以進行這樣的轉義。如果quote中指定了safe關鍵字參數,那麼safe字元串中包含的字元不會進行轉換,默認的safe字元串是"/"。

>>> urllib.quote("+ /?%#&=")"%2B%20/%3F%25%23%26%3D">>> urllib.quote("+ /?%#&=",safe="&#")"%2B%20%2F%3F%25#&%3D"

如果使用quote_plus()方法,那麼空格會自動轉義成 "+"

>>> urllib.quote_plus("+ /?%#&=")"%2B+%2F%3F%25%23%26%3D"

quote和quote_plus有對稱的方法。使用unquote以及unquote_plus,會把%hh類型的字元轉義回來。

在請求網路文件的時候,經常需要在url後面帶上很長的參數,格式類似於a=1&b=2&c=3。如果參數很長的話,一行代碼都加不完。此時可以先把參數存在一個字典裡面,然後使用urlencode快速地把這個字典轉化為url的形式。示例代碼如下:

>>> d={"a":"1","b":"2","c":"3"}>>> urllib.urlencode(d)"a=1&c=3&b=2"

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 萬象IT 的精彩文章:

TAG:萬象IT |