Python2中的urllib、urllib2和 Python3中的urllib、requests
目錄
Python2.x中
Urllib和Urllib2
urllib 和 urllib2 是 python2.x 自帶的模組,提供了一系列用於操作URL的功能。
urllib 和 urllib2 都是接受URL請求的相關模組,但是urllib2可以接受一個Request類的例項來設定URL請求的 headers,urllib 僅可以接受URL。這意味著,urllib不可以偽裝你的User Agent 字串等。
但是urllib提供 urlencode 方法用來對資料進行url編碼,而 urllib2 沒有,所以 urllib 經常和 urllib2 一起使用。
常用方法和類:
urllib2.urlopen( url [, data] [, timeout] )
urlopen方法是urllib2模組最常用也最簡單的方法,它開啟URL網址,
- url 引數可以是一個字串 url 或者是一個Request物件。url 必須是 https:// 的格式
- 對於可選引數 data,表示以 post 方式提交到 url 的資料。不填則為 get 方式提交
- 對於可選的引數 timeout,阻塞操作以秒為單位,如嘗試連線(如果沒有指定,將使用設定的全域性預設timeout值)。實際上這僅適用於HTTP,HTTPS和FTP連線。
import urllib2 #設定代理 proxies={"http":"http://127.0.0.1:8080"} proxy_s=urllib2.ProxyHandler(proxies) opener=urllib2.build_opener(proxy_s) urllib2.install_opener(opener) response = urllib2.urlopen('http://python.org/',timeout=3) #超時時間3秒 html = response.read()
urllib2.urlopen( urllib2.Request [,timeout])
urlopen方法也可通過建立了一個Request物件來明確指明想要獲取的url。呼叫urlopen函式對請求的url返回一個response物件。這個response類似於一個file物件,所以用.read()函式可以操作這個response物件
import urllib2
req = urllib2.Request('http://python.org/')
response = urllib2.urlopen(req,timeout=3)
the_page = response.read()
這裡用到了urllib2.Request 類,對於上例,我們只通過了URL例項化了Request類的物件,其實Request類還有其他的引數 。
class urllib2.Request(url [, data] [, headers] [, origin_req_host] [, unverifiable])
- 對於可選引數data,data 是一個字串,指定額外的資料傳送到伺服器,如果沒有data需要傳送可以不寫。目前使用data的HTTP請求是唯一的。當請求含有data引數時,HTTP的請求為POST,而不是GET。資料應該是快取在一個標準的application/x-www-form-urlencoded格式中。urllib.urlencode()函式用對映或2元組,返回一個這種格式的字串。通俗的說就是如果想向一個URL傳送資料(通常這些資料是代表一些CGI指令碼或者其他的web應用)。對於HTTP來說這動作叫Post。例如在網上填的form(表單)時,瀏覽器會POST表單的內容,這些資料需要被以標準的格式編碼(encode),然後作為一個數據引數傳送給Request物件。Encoding是在urlib模組中完成的,而不是在urlib2中完成的。所以得urllib和urllib2一起結合使用
import urllib
import urllib2
requrl = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name': 'Tom',
'sex' : 'Man',
'id' : '10' }
data = urllib.urlencode(values)
req = urllib2.Request(url=requrl, data=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/20071127Firefox/2.0.0.11”。預設情況下,urllib2把自己識別為Python-urllib/x.y (這裡的xy是python發行版的主要或次要的版本號,如在Python2.6中,urllib2的預設使用者代理字串是“Python-urllib/2.6)。下面的例子在請求時加了一個headers,模仿IE瀏覽器提交請求。
import urllib
import urllib2
requrl = 'http://www.baidu.com/login.php'
values = {'name': 'Tom',
'sex' : 'Man',
'id' : '10' }
data = urllib.urlencode(values)
header = { 'Host': '192.168.153.130',
'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Referer' : 'http://www.python.org/',
'Accept' : '*/*' }
req = urllib2.Request(url=requrl, data=data,headers=header)
response = urllib2.urlopen(req)
the_page = response.read()
##還可以使用add_header方法新增
import urllib2
requrl = 'http://www.baidu.com/login.php'
values = {'name': 'Tom',
'sex' : 'Man',
'id' : '10' }
data = urllib.urlencode(values)
req = urllib2.Request(url=requrl,data=data,headers)
req.add_header('Referer', 'http://www.python.org/')
response = urllib2.urlopen(req)
the_page = response.read()
- 可選引數origin_req_host是RFC2965定義的源互動的request-host。預設的取值是cookielib.request_host(self)。這是由使用者發起的原始請求的主機名或IP地址。例如,如果請求的是一個HTML文件中的影象,這應該是包含該影象的頁面請求的request-host。
- 可選引數unverifiable代表請求是否是無法驗證的,它也是由RFC2965定義的。預設值為false。一個無法驗證的請求是,其使用者的URL沒有足夠的許可權來被接受。例如,如果請求的是在HTML文件中的影象,但是使用者沒有自動抓取影象的許可權,unverifiable的值就應該是true。
Python3.x中
urllib
在python3.x中,把 http 相關的所有包打包成了2個包:http 和 urllib
http 會處理所有客戶端--伺服器http請求的具體細節,其中:
- client 會處理客戶端的部分
- server 會協助你編寫Python web伺服器程式
- cookies 和cookiejar會處理cookie,cookie可以在請求中儲存資料
urllib 是基於 http 的高層庫,它有以下三個主要功能:
- reques t處理客戶端的請求
- response 處理服務端的響應
- parse 會解析url
常見的類和方法
request.urlopen(url [, data] [, timeout])
引數選項和python2.x中的 urllib.urlopen 一樣
from urllib import request
response = request.urlopen('http://python.org/')
html = response.read()
request.urlopen( request.Request )
引數選項和python2.x中的 urllib.urlopen 一樣
from urllib import request
req = request.Request('http://python.org/')
response = request.urlopen(req)
the_page = response.read()
自定義 headers 和 data
from urllib import parse
from urllib import request
url = 'http://www.someserver.com/cgi-bin/register.cgi'
headers = { 'Host': '192.168.153.130',
'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Referer' : 'http://www.python.org/',
'Accept' : '*/*' }
values = {'name': 'Tom',
'sex' : 'Man',
'id' : '10' }
data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data)
response = urllib.request.urlopen(req)
the_page = response.read()
print(the_page.decode("utf8"))
urllib中進行URL編碼和解碼還可以使用quote() 和 unquote()函式
a=urllib.parse.quote("hello,word") #將字串進行編碼
b=urllib.parse.unquote(a) #將字串進行解碼
requests
而requests庫則是非常優秀的第三方庫,它使用 Apache2 Licensed 許可證的 HTTP 庫,用 Python 編寫,真正的為人類著想。Requests 使用的是 urllib3(python3.x中的urllib),因此繼承了它的所有特性。Requests 支援 HTTP 連線保持和連線池,支援使用 cookie 保持會話,支援檔案上傳,支援自動確定響應內容的編碼,支援國際化的 URL 和 POST 資料自動編碼。現代、國際化、人性化
requests模組中可以有很多種請求網頁的方式
- requests.get('http://www.baidu.com')
- requests.post('http://www.baidu.com')
- requests.put('http://www.baidu.com')
- requests.delete('http://www.baidu.com')
- requests.head('http://www.baidu.com')
- requests.options(http://www.baidu.com')
import requests
headers = { 'Host': '192.168.153.130',
'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Referer' : 'http://www.python.org/',
'Accept' : '*/*' }
values = {'name': 'Tom',
'sex' : 'Man',
'id' : '10' }
proxie={"http":"http://127.0.0.1:8080"} #設定代理
response=requests.get('http://www.baidu.com',params=values,headers=headers,timeout=0.1,proxies=proxie)
res.status_code ##狀態碼
res.url ##請求的url
res.request.headers ##請求頭資訊,返回的是一個字典物件,不修改的話,預設是python的請求頭
res.headers ##響應頭資訊,返回的是一個字典物件
responce.headers['Content-Type'] #檢視響應頭的具體部分
res.cookies ##cookie資訊,返回的是一個字典物件
res.text ##響應內容的字串形式,即返回的頁面內容
res.content ##響應內容的二進位制形式
res.encoding='utf-8' ##設定響應的編碼
res.apparent_encoding ##從內容中分析出的響應內容編碼方式(備選編碼方式)