python3urlopen
1. python3中https urlopen()報錯的解決方法
這個錯誤是因為Python 2.7.9 之後引入了一個新特性,當你使用urllib.urlopen一個 https 的時候會驗證一次 SSL證書。當目標使用的是自簽名的證書時就會報urllib.error.URLError錯誤。解決方法如下:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
response = urllib.request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))
通過導入ssl模塊把證書驗證改成不用驗證就行了。
2. python3中urllib2找不到怎麼辦
在python2中使用的urllib2庫在python3中不存在怎麼解決呢?在python3中是urllib.request.urlopen代替了urllib2.
最後列印結果
3. python3中使用urllib進行https請求
剛入門python學習網路爬蟲基礎,我使用的python版本是python3.6.4,學習的教程參考 Python爬蟲入門教程
python3.6的版本已經沒有urllib2這個庫了,所以我也不需要糾結urllib和urllib2的區別和應用場景
參考這篇官方文檔 HOWTO Fetch Internet Resources Using The urllib Package 。關於http(s)請求一般就get和post兩種方式較為常用,所以寫了以下兩個小demo,url鏈接隨便找的,具體場景具體變化,可參考注釋中的基本思路
POST請求:
GET請求:
注意,
使用ssl創建未經驗證的上下文,在urlopen中需傳入上下文參數
urllib.request.urlopen(full_url, context=context)
這是Python 升級到 2.7.9 之後引入的一個新特性,所以在使用urlopen打開https鏈接會遇到如下報錯:
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
所以,當使用urllib.urlopen打開一個 https 鏈接時,需要先驗證一次 SSL 證書
context = ssl._create_unverified_context()
或者或者導入ssl時關閉證書驗證
ssl._create_default_https_context =ssl._create_unverified_context
4. 為什麼我下載的Python3.6,urllib包裡面沒有urlopen方法
Python3.x以上版本里的urllib模塊已經發生改變,此處的urllib都應該改成urllib.request。
例如要寫成這樣:
import urllib.request
web = urllib.request.urlopen('http://www..com')
f = web.read()
print(f)
5. python3爬蟲urllib.request.urlopen("網址").read() 本來是utf-8,為什麼還要加上urlencode(「utf-8」)
你這行代碼是不需要urlencode()的。
對於返回的request對象,其read()方法獲得的其實是一個位元組流對象,而非字元串對象,所以這時需要調用該位元組流對象的decode()方法,按指定編碼方式進行解碼。
至於urlencode(),這是urllib中的一個函數,它的作用是將字元串進行url編碼。這個編碼其實就是個轉義的過程,將那些因可能造成解釋器誤會或安全問題而不適合出現在請求中的符號進行轉義,並且把超出url編碼表的字元降維。