Python的urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。他們兩個最顯着的差異如下:
urllib2可以接受一個Request對象,並以此可以來設置一個URL的headers,但是urllib只接收一個URL。這意味着,你不能偽裝你的用戶代理字符串等。
urllib模塊可以提供進行urlencode的方法,該方法用於GET查詢字符串的生成,urllib2的不具有這樣的功能。這就是urllib與urllib2經常在一起使用的原因。
常用的方法
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函數的返回值的使用,我們下面再詳細說。
import urllib2
req = urllib2.Request('http://python.org/')
response = urllib2.urlopen(req,data='abc')
the_page = response.read()
- urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
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代表的意思請參見文后附錄。
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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。