Python网络请求urllib和urllib3详解
1. 簡介
urllib是Python中請求url連接的官方標準庫,在Python2中主要為urllib和urllib2,在Python3中整合成了urllib。
而urllib3則是增加了連接池等功能,兩者互相都有補充的部分。
2. urllib
urllib作為Python的標準庫,基本上涵蓋了基礎的網絡請求功能。
2.1. urllib.request
urllib中,request這個模塊主要負責構造和發起網絡請求,并在其中加入Headers、Proxy等。
2.1.1. 發起GET請求
主要使用urlopen()方法來發起請求:
from urllib import requestresp = request.urlopen('http://www.baidu.com') print(resp.read().decode())在urlopen()方法中傳入字符串格式的url地址,則此方法會訪問目標網址,然后返回訪問的結果。
訪問的結果會是一個http.client.HTTPResponse對象,使用此對象的read()方法,則可以獲取訪問網頁獲得的數據。但是要注意的是,獲得的數據會是bytes的二進制格式,所以需要decode()一下,轉換成字符串格式。
2.1.2. 發起POST請求
urlopen()默認的訪問方式是GET,當在urlopen()方法中傳入data參數時,則會發起POST請求。注意:傳遞的data數據需要為bytes格式。
設置timeout參數還可以設置超時時間,如果請求時間超出,那么就會拋出異常。
from urllib import requestresp = request.urlopen('http://httpbin.org/post', data=b'word=hello', timeout=10) print(resp.read().decode())2.1.3. 添加Headers
通過urllib發起的請求會有默認的一個Headers:"User-Agent":"Python-urllib/3.6",指明請求是由urllib發送的。
所以遇到一些驗證User-Agent的網站時,我們需要自定義Headers,而這需要借助于urllib.request中的Request對象。
from urllib import requesturl = 'http://httpbin.org/get' headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}# 需要使用url和headers生成一個Request對象,然后將其傳入urlopen方法中 req = request.Request(url, headers=headers) resp = request.urlopen(req) print(resp.read().decode())2.1.4. Request對象
如上所示,urlopen()方法中不止可以傳入字符串格式的url,也可以傳入一個Request對象來擴展功能,Request對象如下所示。
class urllib.request.Request(url, data=None, headers={},origin_req_host=None,unverifiable=False, method=None)構造Request對象必須傳入url參數,data數據和headers都是可選的。
最后,Request方法可以使用method參數來自由選擇請求的方法,如PUT,DELETE等等,默認為GET。
2.1.5. 添加Cookie
為了在請求時能帶上Cookie信息,我們需要重新構造一個opener。
使用request.build_opener方法來進行構造opener,將我們想要傳遞的cookie配置到opener中,然后使用這個opener的open方法來發起請求。
from http import cookiejar from urllib import requesturl = 'https://www.baidu.com' # 創建一個cookiejar對象 cookie = cookiejar.CookieJar() # 使用HTTPCookieProcessor創建cookie處理器 cookies = request.HTTPCookieProcessor(cookie) # 并以它為參數創建Opener對象 opener = request.build_opener(cookies) # 使用這個opener來發起請求 resp = opener.open(url)# 查看之前的cookie對象,則可以看到訪問百度獲得的cookie for i in cookie:print(i)或者也可以把這個生成的opener使用install_opener方法來設置為全局的。
則之后使用urlopen方法發起請求時,都會帶上這個cookie。
# 將這個opener設置為全局的opener request.install_opener(opener) resp = request.urlopen(url)2.1.6. 設置Proxy代理
使用爬蟲來爬取數據的時候,常常需要使用代理來隱藏我們的真實IP。
from urllib import requesturl = 'http://httpbin.org/ip' proxy = {'http':'218.18.232.26:80','https':'218.18.232.26:80'} # 創建代理處理器 proxies = request.ProxyHandler(proxy) # 創建opener對象 opener = request.build_opener(proxies)resp = opener.open(url) print(resp.read().decode())2.1.7. 下載數據到本地
在我們進行網絡請求時常常需要保存圖片或音頻等數據到本地,一種方法是使用python的文件操作,將read()獲取的數據保存到文件中。
而urllib提供了一個urlretrieve()方法,可以簡單的直接將請求獲取的數據保存成文件。
from urllib import requesturl = 'http://python.org/' request.urlretrieve(url, 'python.html')urlretrieve()方法傳入的第二個參數為文件保存的位置,以及文件名。
注:urlretrieve()方法是python2直接移植過來的方法,以后有可能在某個版本中棄用。
2.2. urllib.response
在使用urlopen()方法或者opener的open()方法發起請求后,獲得的結果是一個response對象。
這個對象有一些方法和屬性,可以讓我們對請求返回的結果進行一些處理。
-
read()
獲取響應返回的數據,只能使用一次。
-
getcode()
獲取服務器返回的狀態碼。
-
getheaders()
獲取返回響應的響應報頭。
-
geturl()
獲取訪問的url。
2.3. urllib.parse
urllib.parse是urllib中用來解析各種數據格式的模塊。
2.3.1. urllib.parse.quote
在url中,是只能使用ASCII中包含的字符的,也就是說,ASCII不包含的特殊字符,以及中文等字符都是不可以在url中使用的。而我們有時候又有將中文字符加入到url中的需求,例如百度的搜索地址:
https://www.baidu.com/s?wd=南北
?之后的wd參數,則是我們搜索的關鍵詞。那么我們實現的方法就是將特殊字符進行url編碼,轉換成可以url可以傳輸的格式,urllib中可以使用quote()方法來實現這個功能。
>>> from urllib import parse >>> keyword = '南北' >>> parse.quote(keyword) '%E5%8D%97%E5%8C%97'如果需要將編碼后的數據轉換回來,可以使用unquote()方法。
>>> parse.unquote('%E5%8D%97%E5%8C%97') '南北'2.3.2. urllib.parse.urlencode
在訪問url時,我們常常需要傳遞很多的url參數,而如果用字符串的方法去拼接url的話,會比較麻煩,所以urllib中提供了urlencode這個方法來拼接url參數。
>>> from urllib import parse >>> params = {'wd': '南北', 'code': '1', 'height': '188'} >>> parse.urlencode(params) 'wd=%E5%8D%97%E5%8C%97&code=1&height=188'2.4. urllib.error
在urllib中主要設置了兩個異常,一個是URLError,一個是HTTPError,HTTPError是URLError的子類。
HTTPError還包含了三個屬性:
- code:請求的狀態碼
- reason:錯誤的原因
- headers:響應的報頭
例子:
In [1]: from urllib.error import HTTPErrorIn [2]: try:...: request.urlopen('https://www.jianshu.com')...: except HTTPError as e:...: print(e.code)4033. urllib3
Urllib3是一個功能強大,條理清晰,用于HTTP客戶端的Python庫。許多Python的原生系統已經開始使用urllib3。Urllib3提供了很多python標準庫urllib里所沒有的重要特性:
3.1. 安裝
urllib3是一個第三方庫,安裝非常簡單,pip安裝即可:
pip install urllib33.2. 使用
urllib3主要使用連接池進行網絡請求的訪問,所以訪問之前我們需要創建一個連接池對象,如下所示:
>>> import urllib3 >>> http = urllib3.PoolManager() >>> r = http.request('GET', 'http://httpbin.org/robots.txt') >>> r.status 200 >>> r.data 'User-agent: *\nDisallow: /deny\n'3.2.1. 設置headers
headers={'X-Something': 'value'} resp = http.request('GET', 'http://httpbin.org/headers', headers=headers)3.2.2. 設置url參數
對于GET等沒有請求正文的請求方法,可以簡單的通過設置fields參數來設置url參數。
fields = {'arg': 'value'} resp = http.request('GET', 'http://httpbin.org/get', fields=fields)如果使用的是POST等方法,則會將fields作為請求的請求正文發送。
所以,如果你的POST請求是需要url參數的話,那么需要自己對url進行拼接。
fields = {'arg': 'value'} resp = http.request('POST', 'http://httpbin.org/get', fields=fields)3.2.3. 設置代理
>>> import urllib3 >>> proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'}) >>> resp = proxy.request('get', 'http://httpbin.org/ip') >>> resp.status 200 >>> resp.data b'{"origin":"50.233.136.254"}\n'注:urllib3中沒有直接設置cookies的方法和參數,只能將cookies設置到headers中
轉載地址:https://www.jianshu.com/p/f05d33475c78
總結
以上是生活随笔為你收集整理的Python网络请求urllib和urllib3详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言标准数学函数库math.h之常用函
- 下一篇: Fedora 31 Beta 准时发布,