Python urllib庫的基本使用
阿新 • • 發佈:2021-06-27
1.基本介紹
Python urllib 庫用於操作網頁 URL,並對網頁的內容進行抓取處理。
urllib 庫主要包含以下幾個模組:
- urllib.request # 開啟和讀取url
- urllib.error #包含了該庫丟擲的異常
- urllib.parse #解析url
- urllib.robotparser #解析 robots.txt 檔案
robots.txt 檔案:當蜘蛛訪問網站時,首先會去訪問網站根目錄下的robots.txt檔案,會按照這個檔案中指定的robots協議不去抓取網站中的部分內容。簡單概括的話,robots檔案就是控制搜尋引擎的蜘蛛抓取網站內容的協議。
2.簡單使用
urllib.request 可以模擬瀏覽器的一個請求發起的過程。
urllib.request.urlopen方法來開發一個URL,語法格式如下:
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None):
- url:url 地址。
- data:傳送到伺服器的其他資料物件,預設為 None。
- timeout:設定訪問超時時間。
- cafile 和 capath:cafile 為 CA 證書, capath 為 CA 證書的路徑,使用 HTTPS 需要用到。
- cadefault:已經被棄用。
- context:ssl.SSLContext型別,用來指定 SSL 設定。
http://www.httpbin.org 是一個可以檢測請求的一個網站工具
發起一個簡單get請求
import urllib.request url = "http://www.httpbin.org/get" result = urllib.request.urlopen(url) print(result.read().decode('utf-8')) #對獲取到的網頁進行utf-8解碼 print(result.getcode()) # 200,返回狀態碼 print(result.getheaders()) # 獲取所有responseHeader print(result.getheader("Server")) # 獲取responseHeader中的Server引數
發一個簡單的post請求,當存在data值的時候,就是post請求
import urllib.parse
url = "http://www.httpbin.org/post"
params = {"hello": "world"}
data = urllib.parse.urlencode(params).encode("utf-8") # 對json引數進行編碼
result = urllib.request.urlopen(url=url, data=data)
print(result.read().decode())
超時 timeout
try:
url = "http://www.httpbin.org/get"
result = urllib.request.urlopen(url, timeout=0.01) # 單位:秒
print(result.read().decode())
except urllib.error.URLError as e:
print("Time out! ==> {0}".format(e))
傳送複雜請求
url = "http://www.httpbin.org/post"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-60d6a949-50a80ada4a3a35b9521a5e6d"}
req = urllib.request.Request(url=url, headers=headers, method="POST")
result = urllib.request.urlopen(req)
print(result.read().decode('utf-8'))
class Request:
def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None):
構建Request物件,然後把該物件放入urllib.request.urlopen(req);
- url:請求路徑
- headers:請求頭
- method:請求方式,GET,POST,PUT...
注意:
- 當傳送請求的時候,如果返回的錯誤碼是418,這表示你請求的網站知道你是從urllib傳送的請求,不允許你請求,所以我們需要新增headers請求頭,偽裝自己是瀏覽器發起的請求,如上的header的請求頭。
- 當出現如下異常時,是因為Python 2.7.9 之後版本引入了一個新特性:當你urllib.urlopen一個 https 的時候會驗證一次 SSL 證書 ,當目標使用的是自簽名的證書時就會爆出該錯誤訊息。
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)>
解決辦法:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context