Python的urllib和urllib2模塊都作與請求URL相關的操做,但他們提供不一樣的功能。他們兩個最顯着的差別以下:html
urllib2能夠接受一個Request對象,並以此能夠來設置一個URL的headers,可是urllib只接收一個URL。這意味着,你不能假裝你的用戶代理字符串等。
urllib模塊能夠提供進行urlencode的方法,該方法用於GET查詢字符串的生成,urllib2的不具備這樣的功能。這就是urllib與urllib2常常在一塊兒使用的緣由。python
經常使用的方法json
urllib2.urlopen(url[, data][, timeout])
urlopen方法是urllib2模塊最經常使用也最簡單的方法,它打開URL網址,url參數能夠是一個字符串url或者是一個Request對象。URL沒什麼可說的,Request對象和data在request類中說明,定義都是同樣的。瀏覽器
對於可選的參數timeout,阻塞操做以秒爲單位服務器
import urllib2 response = urllib2.urlopen('http://python.org/') html = response.read()
urlopen方法也可經過創建了一個Request對象來明確指明想要獲取的url。調用urlopen函數對請求的url返回一個response對象。這個response相似於一個file對象,因此用.read()函數能夠操做這個response對象,關於urlopen函數的返回值的使用,咱們下面再詳細說。cookie
import urllib2 req = urllib2.Request('http://python.org/') response = urllib2.urlopen(req,data='abc') the_page = response.read()
Request類是一個抽象的URL請求。
這裏用到了urllib2.Request類,對於上例,咱們只經過了URL實例化了Request類的對象,其實Request類還有其餘的參數。
data是做爲參數請求,若是data不等於None,則該請求爲POST,不然爲GET函數
import urllib import urllib2 url = 'http://www.baidu.com' values = {'name' : 'qiangzi', 'age' : 27, 'id' :1} data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) the_page = response.read()
headers——是字典類型,頭字典能夠做爲參數在request時直接傳入,也能夠把每一個鍵和值做爲參數調用add_header()方法來添加。做爲辨別瀏覽器身份的User-Agent header是常常被用來惡搞和假裝的,由於一些HTTP服務只容許某些請求來自常見的瀏覽器而不是腳本,或是針對不一樣的瀏覽器返回不一樣的版本。例如,Mozilla Firefox瀏覽器被識別爲「Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11」。默認狀況下,urlib2把本身識別爲Python-urllib/x.y(這裏的xy是python發行版的主要或次要的版本號,如在Python 2.6中,urllib2的默認用戶代理字符串是「Python-urllib/2.6。下面的例子和上面的區別就是在請求時加了一個headers,模仿IE瀏覽器提交請求。網站
import urllib import urllib2 url = 'http://www.baidu.com' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' values = {'name' : 'qiangzi', 'age' : 27, 'id' :1} headers = { 'User-Agent' : user_agent } data = urllib.urlencode(values) req = urllib2.Request(url, data, headers) response = urllib2.urlopen(req) the_page = response.read()
添加header也能夠採用另外一種方案
req.add_header('Referer', 'http://www.python.org/')
3)其餘的一些經常使用方法
geturl() — 返回檢索的URL資源,這個是返回的真正url,一般是用來鑑定是否重定向的,以下面代碼4行url若是等於「http://www.python.org/ 」說明沒有被重定向。若是被重定向了,有可能這個被重定向的值是須要用的,好比下載的時候若是咱們要獲取那個最終的下載地址
getcode() — 返回響應的HTTP狀態代碼,運行下面代碼能夠獲得code=200,具體各個code表明的意思請參見文後附錄。ui
4)HTTPCookieProcessor
不少網站的資源須要用戶登陸以後才能獲取。
咱們一旦登陸後再訪問其餘被保護的資源的時候,就再也不須要再次輸入帳號、密碼。那麼網站是怎麼辦到的呢?
通常來講,用戶在登陸以後,服務器端會爲該用戶建立一個Session。Session至關於該用戶的檔案。該檔案就表明着該用戶。
那麼某一次訪問請求是屬於該用戶呢?登陸的時候服務器要求瀏覽器儲存了一個Session ID的Cookie值。每個訪問都帶上了該Cookie。服務器將Cookie中的Session ID與服務器中的Session ID比對就知道該請求來自哪一個用戶了。編碼
opener
咱們在調用urllib2.urlopen(url)的時候,其實urllib2在open函數內部建立了一個默認的opener對象。而後調用opener.open()函數。
可是默認的opener並不支持cookie。
那麼咱們先新建一個支持cookie的opener。urllib2中供咱們使用的是HTTPCookieProcessor。
建立HTTPCookieProcessor須要一個存放cookie的容器。
Python提供的存放cookie的容器位於cookielib,有如下幾個。
CookieJar -> FileCookieJar -> MozillaCookieJar / LWPCookieJar
import cookielib import urllib2 cookies = cookielib.CookieJar() cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies) opener = urllib2.build_opener(cookieHandler) request = urllib2.Request("http://www.baidu.com") urllib2.urlopen(request) for cookie in cookies: print cookie.name, cookie.value
上面的代碼顯示,urllib2的確幫咱們把cookie從response中提取出來。可是如何保存在一個文件中呢?
urllib2.install_opener(opener)
會設置 urllib2 的全局 opener
最後來說解下這個json包
json.dumps 將 Python 對象編碼成 JSON 字符串
json.loads 將已編碼的 JSON 字符串解碼爲 Python 對象
原做者:我是強子連接:http://www.jianshu.com/p/1416ccc99979來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。