python使用osgeo库_Python使用内置urllib模块或第三方库requests访问网络资源
前言
更多內容,請訪問我的 個人博客。
Python 訪問網絡資源有很多方法,urllib, urllib2, urllib3, httplib, httplib2, requests ,現介紹如下兩種方法:
- 內置的 urllib 模塊 - 優點:自帶模塊,無需額外下載第三方庫 - 缺點:操作繁瑣,缺少高級功能 - 第三方庫 requests - 優點:處理URL資源特別方便 - 缺點:需要下載安裝第三方庫
內置的 urllib 模塊
發起GET請求
主要使用urlopen()方法來發起請求,如下:
from urllib import requestresp = request.urlopen('http://www.baidu.com') print(resp.read().decode())訪問的結果會是一 個http.client.HTTPResponse 對象,使用此對象的 read() 方法,則可以獲取訪問網頁獲得的數據。但是要注意的是,獲得的數據會是 bytes 的二進制格式,所以需要 decode() 一下,轉換成字符串格式。
發起POST請求
urlopen() 默認的訪問方式是GET,當在 urlopen() 方法中傳入data參數時,則會發起POST請求。注意:傳遞的data數據需要為bytes格式。
設置timeout參數還可以設置超時時間,如果請求時間超出,那么就會拋出異常。如下:
from urllib import requestresp = request.urlopen('http://www.baidu.com', data=b'word=hello', timeout=10) print(resp.read().decode())添加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())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。
添加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)設置Proxy代理
使用爬蟲來爬取數據的時候,常常需要使用代理來隱藏我們的真實IP。如下:
from urllib import requesturl = 'http://www.baidu.com' proxy = {'http':'222.222.222.222:80','https':'222.222.222.222:80'} # 創建代理處理器 proxies = request.ProxyHandler(proxy) # 創建opener對象 opener = request.build_opener(proxies)resp = opener.open(url) print(resp.read().decode())下載數據到本地
在我們進行網絡請求時常常需要保存圖片或音頻等數據到本地,一種方法是使用python的文件操作,將read()獲取的數據保存到文件中。
而urllib提供了一個urlretrieve()方法,可以簡單的直接將請求獲取的數據保存成文件。如下:
from urllib import requesturl = 'http://python.org/' request.urlretrieve(url, 'python.html')urlretrieve() 方法傳入的第二個參數為文件保存的位置,以及文件名。
注意:urlretrieve() 方法是python2直接移植過來的方法,以后有可能在某個版本中棄用。
第三方庫 requests
安裝
由于 requests是第三方庫,所以要先安裝,如下:
pip install requests發起GET請求
直接用 get 方法,如下:
import requestsr = requests.get('http://www.baidu.com/') print(r.status_code) #狀態 print(r.text) #內容對于帶參數的URL,傳入一個dict作為params參數,如下:
import requestsr = requests.get('http://www.baidu.com/', params={'q': 'python', 'cat': '1001'}) print(r.url) #實際請求的URL print(r.text)requests的方便之處還在于,對于特定類型的響應,例如JSON,可以直接獲取,如下:
r = requests.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json') r.json()# {'query': {'count': 1, 'created': '2017-11-17T07:14:12Z', ...添加Headers
需要傳入HTTP Header時,我們傳入一個dict作為headers參數,如下:
r = requests.get('https://www.baidu.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})獲取響應頭,如下:
r.headers # {Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}r.headers['Content-Type'] # 'text/html; charset=utf-8'發起POST請求
要發送POST請求,只需要把get()方法變成post(),然后傳入data參數作為POST請求的數據,如下:
r = requests.post('https://accounts.baidu.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})requests默認使用application/x-www-form-urlencoded對POST數據編碼。如果要傳遞JSON數據,可以直接傳入json參數,如下:
params = {'key': 'value'} r = requests.post(url, json=params) #內部自動序列化為JSON上傳文件
上傳文件需要更復雜的編碼格式,但是requests把它簡化成files參數,如下:
upload_files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=upload_files)在讀取文件時,注意務必使用 'rb' 即二進制模式讀取,這樣獲取的 bytes 長度才是文件的長度。
把 post() 方法替換為 put() , delete() 等,就可以以PUT或DELETE方式請求資源。
添加Cookie
在請求中傳入Cookie,只需準備一個dict傳入cookies參數,如下:
cs = {'token': '12345', 'status': 'working'} r = requests.get(url, cookies=cs)requests對Cookie做了特殊處理,使得我們不必解析Cookie就可以輕松獲取指定的Cookie,如下:
r.cookies['token'] # 12345指定超時
要指定超時,傳入以秒為單位的timeout參數。超時分為連接超時和讀取超時,如下:
try:# 3.1秒后連接超時,27秒后讀取超時r = requests.get(url, timeout=(3.1, 27)) except requests.exceptions.RequestException as e:print(e)超時重連
def gethtml(url):i = 0while i < 3:try:html = requests.get(url, timeout=5).textreturn htmlexcept requests.exceptions.RequestException:i += 1添加代理
同添加headers方法,代理參數也要是一個dict,如下:
heads = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit' } proxy = {'http': 'http://120.25.253.234:812','https' 'https://163.125.222.244:8123' } r = requests.get('https://www.baidu.com/', headers=heads, proxies=proxy)更多編程教學請關注公眾號:潘高陪你學編程
總結
以上是生活随笔為你收集整理的python使用osgeo库_Python使用内置urllib模块或第三方库requests访问网络资源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020黑群晖最稳定版本_80%用户的选
- 下一篇: rust设置里面那个是能见度_IDEA