Urllib 是Python自帶的標準庫,無需安裝,直接能夠用。
提供了以下功能:安全
網頁請求 響應獲取 代理和cookie設置 異常處理 URL解析
爬蟲所須要的功能,基本上在urllib中都能找到,學習這個標準庫,能夠更加深刻的理解後面更加便利的requests庫。cookie
先來一個最簡單的例子:socket
from urllib import request response = urllib.request.urlopen('http://www.baidu.com') print(response.read().decode('utf-8'))
執行後就能夠獲得百度首頁的 HTML 。ide
response對象有一個read方法,能夠返回獲取到的網頁內容。函數
若是不加read直接打印會直接打印出了該對象的描述post
上面使用了一個 urlopen的函數,urlopen()函數用於實現對目標url的訪問。學習
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
#url:訪問的網址網站
#data:額外的數據,如header,form data編碼
從上一篇文章能夠看到數據傳送主要分爲POST和GET兩種方式。那這兩種方式有什麼區別呢?url
最重要的區別:
GET方式直接以連接形式訪問,連接中包含了全部的參數,若包含了密碼的話是不安全的,不過你能夠直觀地看到本身提交了什麼內容。POST則不會在網址上顯示全部的參數,不過若是你想直接查看提交了什麼就不太方便了。
先演示一下吧:
import urllib.parse import urllib.request values = {"username":"1559186****","password":"*********"} data = urllib.parse.urlencode(values) url = "https://passport.csdn.net/account/login" response = urllib.request.urlopen(url,data) print(response.read())
urlencode是一個函數,可將字符串以URL編碼,用於編碼處理。
能夠看到核心的代碼是 response = urllib.request.urlopen(url,data)
這裏用到了data參數(或者說POST方式用到了data參數)。例子上的data參數中的內容十分簡單、因此並不能真正的登陸。
一樣的,先舉個例子:
import urllib.parse import urllib.request values = {"username":"15591861964","password":"yanhang1235813"} data = urllib.parse.urlencode(values) url = "https://passport.csdn.net/account/login" geturl = url + "?"+data response = urllib.request.urlopen(geturl) print(response.read())
能夠看到此次的核心代碼是這樣的 :response = urllib.request.urlopen(geturl)
沒有了data參數、只是url參數。而URL參數的內容是原來的url加 ?而後加編碼後的參數。
從上面的POST和GET兩種不一樣方式的例子就驗證了一個結論,
GET方式直接以連接形式訪問,連接中包含了全部的參數
POST則不會在網址上顯示全部的參數
下面是擴展學習的一些東西(Urllib庫的其餘內容)
開始練習的時候我是對 http://httpbin.org/post 這個網站發的請求,可是遲遲沒有響應、、、
最終返回了報錯信息urllib.error.HTTPError: HTTP Error 503: Service Unavailable
那若是給請求設置一個超時時間應該會好一點,urlopen有一個timeout參數
from urllib import request response = request.urlopen('http://httpbin.org/get', timeout=0.1) print(response.read())
此次的錯誤返回信息是:
urllib.error.URLError: <urlopen error timed out>
也能夠將這個做爲異常、捕獲處理
import socket import urllib.request import urllib.error try: response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1) except urllib.error.URLError as e: if isinstance(e.reason, socket.timeout): print('TIME OUT')
做者:Ghost9
來源:CSDN
原文:https://blog.csdn.net/Ghost9/article/details/80255039