Python的urllib和urllib2模塊都做與請求URL相關的操作。
它們最顯著的差異為:
urllib2可以接受一個Request對象,並以此可以來設置一個URL的headers,但是urllib只接收一個URL。
urllib模塊可以提供進行urlencode的方法,該方法用於GET查詢字符串的生成,urllib2的不具有這樣的功能.
python 2.7.x提供了urllib與urllib2,鑒於上述異同兩個庫通常搭配使用。
urlopen
urllib2.urlopen(url, *data, *timeout)
urlopen方法是urllib2模塊最常用的方法,用於訪問發送某一請求。
url參數可以是一個字符串url或者是一個Request對象。
可選參數timeout用於設置超時時間,以秒為單位。
如果沒有指定,將使用設置的全局默認timeout值。
urlopen使用默認opener進行訪問, 為阻塞式IO.
如果請求成功,函數將返回響應。
在data為None時默認用GET方法:
import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()
print(html)
使用POST發送參數前需要先將參數編碼:
import urllib
import urllib2
values = {
'action': 'sign-in',
'username': 'finley',
'password': '1234'
}
values = urllib.urlencode(values)
response = urllib2.urlopen('http://127.0.0.1:8080/game', values)
print(response.read())
urllib.urlencode不能直接進行Unicode編碼,需要先進行轉碼:
urllib.urlencode (u'bl'.encode('utf-8'))
qutoe與urlencode均可以進行編碼,區別在於quote的空格由%20替代而urlencode的空格由+替代。
Request
使用Request對象可以設置更多請求參數:
Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
-
url: url字符串
-
data:額外發送的數據
在data為None時默認用GET方法提交,有參數時默認用POST方法提交
示例:
import urllib
import urllib2
url = 'http://127.0.0.1:8080/game'
values = {
'action': 'sign-in',
'username': 'finley',
'password': '1234'
}
data = urllib.urlencode(values)
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
html = response.read()
cookie
為了使用cookie我們需要一個opener對象來維護cookiejar.
class BaseDriver:
def __init__(self):
self.opener = None
self.cookiejar = None
self.initOpener()
def initOpener(self):
self.cookiejar = cookielib.CookieJar()
self.opener = urllib2.build_opener(
urllib2.HTTPCookieProcessor(self.cookiejar)
)
def get_cookie(self):
for cookie in self.cookiejar:
if cookie.name == 'csrftoken':
return cookie.value
return None
def doRequest(self, action, values):
data = urllib.urlencode(values)
request = urllib2.Request(url, data)
return self.opener.open(request)
參考資料:
