最後更新於 2021 年 6 月 4 日
Urllib
Urllib是Python附帶的標準函數庫,無須安裝,可直接import。通常用於爬蟲開發、API資料取得和測試。在Python2 分為Urllib和Urllib2,Urllib2 可接收一個Request物件,並以此來設定一個URL的Headers,但Urllib只接收一個URL,表示不能偽裝使用者代理字串等。
Urllib模組可以提供進行Urlencode的方法,該方法用於GET查詢字串的產生,Urllib2不具有這樣的功能。這也是Urllib和Urllib2經常在一起使用的原因。
在Python3中,Urllib模組是一個收集幾個模組來使用URL的軟體套件,就是將Urllib和Urllib2 合併在一起使用,並命名為Urllib。
大致具備以下功能:
- urllib.request:用於開啟和讀取URL。
- urllib.error:包含提出的例外urllib.request。
- urllib.parse:用於解析URL。
- urllib.robotparser:用於解析robots.txt檔案。
發送請求
urllib.request.urlopen的語法如下:
urllib.request.urlopen(url , data = None , [timeout, ]* , cafile = None , capath = None , cadefault = False , context = None)
Urllib是用於存取URL的唯一方法。
參數解釋
url:需要造訪的網站的URL位址。格式必須完整,如:https://www.google.com/為完整的URL,若url為google.com/,則程式執行時間會提示無法識別URL的錯誤。
data:預設值為 None ,Urllib判斷參數data是否為None進一步區分請求方式,若data為None則代表請求方式為GET,反之則為POST。參數data以字典形式儲存資料,並將參數data的字典類型轉換成位元組類型才能完成POST請求。
timeout:逾時設定,指定阻塞操作(請求時間)的逾時,如果未指定則使用全域預設逾時設定。
cafile、capath、cadefault:使用參數指定一組HTTPS請求的可信CA憑證。cafile應指向包含一組CA憑證的單一檔案;capath應指向憑證檔案的目錄;cadefault通常使用預設值即可。
context:描述各種SSL選項的實例。
實際使用中,最常使用的參數有url、data、timeout。
當對網站發送請求時,網站會回傳對應的回應內容。urlopen物件提供取得網站回應內容的方法函數,分別為:
read()、readline()、readlines()、fileno()、close():對HTTPResponse類類型資料操作。
實例
下面的實例用於實現Urllib模組對網站發送請求並將回應內容寫入文字檔:
import urllib.request response = urllib.request.urlopen('https://www.youtube.com/results?search_query=%E5%96%BB%E8%A8%80',None,2) html = response.read().decode('utf-8') f = open('html.txt','w',encoding='utf-8') f.write(html) f.close()
此段程式碼首先匯入urllib.request模組,然後透過urlopen造訪一個URL,請求方式是GET;最後的參數用於設定逾時,設定為2秒,若超過2秒網站還沒傳回回應資料就會提示請求失敗的錯誤訊息。
當獲得伺服器的回應後透過response.read()取得其回應內容。read()方式回傳的是一個bytes類型的資料,需要透過decode()來轉換成str類型。最後將資料寫入文字檔中,encoding用於設定文字文件的編碼格式,資料編碼必須與文字檔編碼一致,否則會出現亂碼。
一個完整的HTTP請求必須要有請求標頭資訊,而urllib.request.Request的作用是設定HTTP的請求標頭資訊。使用urllib.request.Request將剛剛的例子設定請求標頭:
import urllib.request url = 'https://www.youtube.com/results?search_query=%E5%96%BB%E8%A8%80' headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36', 'Referer' : 'https://www.youtube.com/', 'Connection' : 'keep-alive' } req = urllib.request.Request(url,headers=headers) html = urllib.request.urlopen(req).read().decode('utf-8') f = open('html.txt','w',encoding='utf-8') f.write(html) f.close()
User-Agent怎麼取得?
按F12開啟「開發人員工具」-「Network」-「docs」,然後刷新頁面會出現一個檔案,點開檔案選擇「Headers」最下方就會出現 user-agent。
Urllib發送POST請求的方法如下:
import urllib.request import urllib.parse url = 'https://www.youtube.com/' data = { 'value' : 'true', } data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.urlopen(url, data=data)
上段程式碼中,urllib.parse.urlencode(data)將資料轉換成位元組的資料類型,而encode(‘utf-8’) 設定位元組的編碼格式。除此之外,Urllib還提供quote()和unquote()對URL編碼處理,之後再提。
Requests
Requests是Python的很實用的HTPP使用者端函數庫,完全滿足如今網路爬蟲的需求。與Urllib比較,Requests不僅具備Urllib的全部功能;在開發使用上語法簡單容易、完全符合Python優雅、簡潔的特性;在相容性上完全相容Python2 與 Python3,具有較強的適用性。
Requests可透過pip安裝:
# windows pip install requests # Linux sudo pip install requests
除了透過pip安裝外,也可以下載whl檔案安裝,方法如下:
造訪 https://www.lfd.uci.edu/~gohlke/pythonlibs/ ,按Ctrl+F搜尋「requests」,下載「requests‑2.23.0‑py2.py3‑none‑any.whl」。
下載好後解壓縮放進Python的安裝目錄 Lib\site-packages (C:\Users\使用者名稱\AppData\Local\Programs\Python\Python38\Lib\site-packages)中即可。
除了解壓whl,還可以使用pip安裝whl檔案。例如把下載的檔案丟到某處,開啟CMD將路徑切換到該位置,輸入安裝指令:
pip install requests‑2.23.0‑py2.py3‑none‑any.whl
完成Requests安裝後,在終端輸入:
E:\>Python >>> import requests >>> requests.__version__ '2.23.0'
檢視Requests版本資訊,檢測是否安裝成功。
請求方式
HTTP的常用請求是GET和POST,Requests對此區分兩種不同的請求方式。
GET請求有兩種形式,分別是沒有參數與有參數,以Youtube為例:
# 沒有參數 https://www.youtube.com/ # 帶有參數 search_query https://www.youtube.com/results?search_query=python
一般URL末尾有帶 ? 就代表該URL是有帶請求參數的,GET參數說明如下:
- search_query是參數名稱,參數名稱由網站規定。
- python是參數值,由使用者自行設定。
- 如果一個URL有多個參數,參數之間用”&”連接。
Requests實現GET請求,對於帶有參數的URL有兩種請求方式:
import requests # 第一種方式 r = requests.get('https://www.youtube.com/results?search_query=python') # 第二種方式 url = 'https://www.youtube.com/results' params = {'search_query':'python'} # 左邊params在GET請求中表示設定參數 r= requests.get(url,params=params) # 輸出產生的URL print(r.url)
Requests實現POST請求須設定請求參數data,資料格式可以為字典、元組、清單和JSON格式。
# 字典 data = {'key1' : 'value1' , 'key2' : 'value2'} # 元組或列表 (('key1','value1'),('key2':'value2')) # JSON import json data = {'key1':'value1' , 'key2':'value2'} # 將字典轉為JSON data = json.dumps(data) # 發送POST請求 r = requests.post("https://www.youtube.com/",data = data) print(r.text)
另外Requests還提供了 r.status_code、r.raw、r.content、r.text、r.headers、r.json()、r.raise_for_status()、r.url、r.cookies、r.encoding,10種方式取得回應內容。
- 解決 preact-router 資源請求路徑錯誤的問題 - 2022 年 6 月 24 日
- [楓之谷私服] 潮流轉蛋機 NPC 腳本優化 - 2022 年 6 月 19 日
- [楓之谷私服] 簡單的飛天椅子(坐騎)改法 v120 - 2022 年 6 月 19 日